Cópia Unix para cada linha no arquivo

2

Eu tenho um arquivo, file_copy , que tem:

>cat file_copy
file1
file2
file3

Eu quero copiar file1 , file2 , file3 de /source para /dest . Uma maneira que eu sei fazer isso é apenas fazer:

for line in 'cat file_copy' ; do cp /source/$line /dest; done

Mas eu sei que existe uma maneira melhor, provavelmente usando find / xargs e / ou awk, etc. Qual é a maneira preferida de fazer isso?

    
por prelic 09.09.2013 / 16:19

2 respostas

7

A melhor maneira de iterar as linhas em um arquivo é usando while :

while read line; do cp /source/"$line" /dest/; done < file_copy

E enquanto o acima é bom o suficiente para a maioria dos casos, uma solução mais robusta (embora raramente necessária) é:

while IFS= read -r line; do cp /source/"$line" /dest/; done < file_copy

O IFS= impede que o espaço em branco seja cortado no início e no final de uma linha. -r impede que as barras invertidas sejam descartadas.

Em relação ao seu comando original:

  • Há um uso inútil do gato .

  • Você não deve ler as linhas com for porque é propenso a erros quando suas linhas contêm espaço em branco. Na prática, se você estiver usando for com qualquer outra coisa além de criar um loop sobre nomes de arquivos gerados pelo shell (por exemplo, for f in *.csv ), provavelmente você está fazendo algo errado.

  • Você também deve citar suas variáveis para evitar que os nomes de arquivos com espaços sejam divididos em vários argumentos.

por 09.09.2013 / 16:24
3

Para melhorar o desempenho, considere fazer isso:

tar -cf -  'cat source.txt' | (cd $dest ; tar -xf -)

Compactar arquivos dentro de sua fonte e extraí-los fará o trabalho mais rápido que o loop!

    
por 07.08.2018 / 13:32

Tags