xargs
faz uma quantidade infeliz de análise em sua entrada e, dependendo de quais caracteres ocorrem em nomes de arquivos (espaços, citações / apóstrofos, barras invertidas, tabulações, etc), pode manipulá-los de várias maneiras. A melhor maneira de manipular nomes de arquivos é como uma lista delimitada por nulo e usando xargs -0
(que desativa toda a análise). Se a lista de arquivos fosse gerada a partir de find
, isso seria fácil (basta usar -print0
). Como você está lidando com a saída de um script perl, vejo duas opções: modificar o script perl para gerar valores nulos em vez de feeds de linha ou, se não for possível, convertê-los no pipeline com tr
:
cat files.txt | tr "\n" "cat files.txt | tr "\n" "%pre%" | xargs -0 -I{} cp "{}" ~/Desktop/temp
" | xargs -0 -I{} cp "{}" ~/Desktop/temp