Uma solução seria:
xargs --max-args=1 find . -iname < fileNames.txt
Considere:
cat fileNames.txt | xargs find . -name
Espero que o comando acima encontre o caminho de cada nome de arquivo em fileNames.txt, mas esse comando não produz saída. Por quê?
Uma chamada normal de xargs
remove os caracteres de nova linha, colocando todas as linhas da entrada em uma única linha de comando. No entanto, você pode usar a opção -I <pattern>
, em que um comando será chamado para cada linha de entrada, com <pattern>
substituído pelo conteúdo da linha.
Note também que você provavelmente deve adicionar a opção -print
para ter os caminhos listados.
cat fileNames.txt | xargs -I {} find . -name {} -print
A opção -name
aceita apenas um único argumento. Não sei por que você não está recebendo uma mensagem de erro. Experimente
sed 's/.*/-name "&"/' fileNames.txt | xargs find .
As respostas até agora têm dificuldades com nomes de arquivos que contêm espaço "ou":
$ echo \'\ \" | xargs -I {} find . -name {} -print
xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option
$ echo \'\ \" | sed 's/.*/-name "&"/' | xargs find .
xargs: unmatched double quote; by default quotes are special to xargs unless you use the -0 option
find: missing argument to '-name'
Se os arquivos forem feitos por usuários, você irá experimentar arquivos com nomes engraçados. Se você tem o GNU Parallel instalado, você pode fazer:
cat fileNames.txt | parallel find . -name {} -print
Assista ao vídeo de introdução para saber mais sobre o GNU Parallel: link
O GNU Parallel pode ser baixado em ftp://ftp.gnu.org/gnu/parallel/ e tem foi relatado estar trabalhando sob Cygwin.