Bash Script для cp-файлов из списка

другое решение awk

$ cat ip.txt 
[ABC]
value1=bla
value2=bla
value3=bla
[XYZ]
value1=bla
value2=bla
value3=bla

Если строка начинается с [, назначьте флаг, который будет установлен или сброшен в зависимости от имени блока. Затем, если флаг установлен, выполните замену

$ awk '/^\[/{f=/\[ABC\]/} f{sub("value1=bla","value1=nobla")} 1' ip.txt 
[ABC]
value1=nobla
value2=bla
value3=bla
[XYZ]
value1=bla
value2=bla
value3=bla


Аналогичное решение в perl , замените замену для демонстрации

$ perl -pe '$f=/\[ABC\]/ if /^\[/; s/value2=bla/value2=nobla/ if $f;' ip.txt 
[ABC]
value1=bla
value2=nobla
value3=bla
[XYZ]
value1=bla
value2=bla
value3=bla


Если все справа от = должно быть изменено независимо от В частности, соответствующий bla , используйте

awk '/^\[/{f=/\[ABC\]/} f{sub(/value1=.*/,"value1=nobla")} 1' ip.txt 
perl -pe '$f=/\[ABC\]/ if /^\[/; s/value2=.*/value2=nobla/ if $f;' ip.txt
2
09.12.2016, 01:29
2 ответа

Попробуйте это. (Не тестировалось.)

destination=     # assign 
i=0
while read line; do
    cp --parents "$line" "$destination"
    ((i++))
    [ $i -eq 100 ] && sleep 600 && i=0
done < outfile.txt
# or: done < <(find ... and so on) # to avoid creating the temp file
5
27.01.2020, 21:54

Измените "echo cp" на ваш реальный cp , и следующее должно сделать это. Он будет спать 10 минут после каждых 100 файлов. Предполагается, что ни одно из ваших имен файлов не содержит / не содержит символов новой строки, так что каждая строка в файле outfile.txt соответствует имени файла.

#!/usr/bin/env bash
count=0
while IFS= read -r file
do
  echo cp "$file" dest/
  count=$((++count))
  [[ $(($count % 100)) == 0 ]] && sleep $((10 * 60))
done < outfile.txt
1
27.01.2020, 21:54

Теги

Похожие вопросы