bash executa o comando para argumentos X de cada vez

0

Eu tenho uma lista de arquivos armazenados no arquivo txt.

./test7
./test4
./test1
./test5
./test6
./test10
./test8
./test2
./test9
./test3

Eu quero executar um comando em todos esses arquivos, mas eu quero dormir um segundo depois que cada dois arquivos são processados, por exemplo:

cp ./test1 test1-backup
cp ./test2 test2-backup
sleep 1
cp ./test3 test3-backup
cp ./test4 test4-backup
sleep 1
...
cp ./test9 test9-backup
cp ./test10 test10-backup

Existe uma maneira de conseguir isso pelo script bash? Eu gostaria de parametrizar a quantidade de comandos executados por 1 iteração (chamando sleep 1). Outro problema é que a lista real de arquivos tem centenas de milhares de linhas.

    
por user1854959 13.04.2015 / 17:11

2 respostas

3

Eu suponho que você não esteja descrevendo seu cenário do mundo real: você não apenas deseja copiar centenas de milhares de arquivos, mas também quer dormir por centenas de milhares de segundos ... wtf?!?

De qualquer forma:

while IFS= read -r file1
      IFS= read -r file2
do
    cp "$file1" "${file1##*/}-backup"
    cp "$file2" "${file2##*/}-backup"
    sleep 1
done < inputFile
    
por 13.04.2015 / 17:58
1

Desculpe : Eu não notei o "arquivo txt" com as "centenas de milhares de linhas". Esta é apenas uma solução naif ...

for a in test*; do ls -l $a; if [[ $((i++ % 2)) != 0 ]]; then sleep 1; fi; done

Atualizar : Explicação e (atualizar parcialmente para o arquivo txt com nomes de arquivos).

... reformatando:

for a in 'cat file.txt'
do 
   cp "$a" "$a-backup"              ## REPLACE THIS LINE 
   if [[ $((i++ % 2)) != 0 ]] then
       sleep 1
   fi
done
  • este meio de uma linha; for a in files processa o arquivo $ a e dorme se for uma linha par.

Para ver se a linha está nivelada, estamos contando ( i++ ) e vendo se i % 2 is 0

  • no bash $(( ...exp )) calcula ...exp como expressão numérica
  • dessa forma, $((i++ % 2)) != 0 será verdadeiro para até mesmo iterações (e neste caso nós sleep 1 )
  • no bash [[ ...exp ]] calcula ...exp como expressão booleana

Nota: esta solução funcionou com file.txt contendo 100_000 ficheiros, mas irá falhar muito file.txt

    
por 13.04.2015 / 17:25