'find' com 'xargs'

1

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ê?

    
por dharm0us 15.11.2010 / 10:20

4 respostas

4

Uma solução seria:

 xargs --max-args=1 find . -iname < fileNames.txt
    
por 15.11.2010 / 11:01
3

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
    
por 15.11.2010 / 11:10
1

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 .
    
por 15.11.2010 / 10:57
1

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.

    
por 15.11.2010 / 15:48