Como executo o find com o GNU xargs para percorrer um conjunto de diretórios?

0
$ echo {a,b,c}.h d e.h |xargs -IA find A -name '*.h'
find: 'a.h b.h c.h d e.h': No such file or directory
$ echo -e a.h\nb.h c.h d e.h |xargs -IA find A -name '*.h'
a.h
find: 'b.h c.h d e.h': No such file or directory

O problema é que -I implica que xargs assumirá que os argumentos são delimitados por nova linha. Não sei por que isso acontece. Eu acho que posso resolver este problema com sed, mas eu me pergunto se há um truque de xargs ou idiom não estou familiarizado com o que as pessoas usam para resolver isso.

Estou procurando uma solução que funcione também no OS X. No OS X, a opção xargs -J parece funcionar bem. A manpage afirma que essa opção apenas controlará onde os argumentos são colocados para o executável - que é exatamente o que eu quero.

    
por wilhelmtell 07.02.2010 / 20:49

4 respostas

0

Hmm. Você precisa do pipe e dos xargs? Parece que todo o seu exemplo realmente precisa de find e echo .

Eu estou supondo que este é um pedaço de um quebra-cabeça maior, então isso pode não funcionar no contexto do que você está fazendo, mas seu exemplo poderia ser escrito como:

$ find 'echo {a,b,c}.h d e.h' -name '*.h'

$ find $(echo {a,b,c}.h d e.h) -name '*.h'

... que, no meu sistema, resulta em find verificando cada argumento individualmente:

find: 'a.h': No such file or directory
find: 'b.h': No such file or directory
find: 'c.h': No such file or directory
find: 'd': No such file or directory
find: 'e.h': No such file or directory

Eu não tenho uma máquina OSX para testar, e isso pode ser específico para o bash.

    
por 07.02.2010 / 21:23
0

Por que não apenas find {a,b,c}.h d e.h -name '*.h' ?

    
por 07.02.2010 / 22:22
0

você tentou a opção -d para xargs?

justin@eee:~$ echo {a,b,c}.h d e.h |xargs -d ' ' -n1  -IA echo foo A
foo a.h
foo b.h
foo c.h
foo d
foo e.h

ou ainda mais simples,

justin@eee:~$ for x in $(echo {a,b,c}.h d e.h);do echo foo $x;done
foo a.h
foo b.h
foo c.h
foo d
foo e.h
    
por 07.02.2010 / 23:00
0

Use o Paralelo GNU:

parallel -q find {} -name '*.h' ::: {a,b,c}.h d e.h

Assista ao vídeo de introdução para saber mais: link

    
por 18.04.2011 / 16:33

Tags