Usando xargs com find

0

Desejo excluir alguns diretórios da pesquisa de arquivos e depois executar o comando find para localizar os arquivos necessários. Estou usando o comando abaixo

find . -maxdepth 1 -type d | grep -E -i 'sensors' | grep -v '.test' | xargs find -name '*.java'

Mas isso gera o seguinte erro

find: paths must precede expression
    
por Poorna 24.07.2013 / 05:29

3 respostas

1

O primeiro achado fará com que o segundo achado liste tudo duas vezes, a menos que você também exclua o diretório atual. Isso acontece porque a saída da primeira descoberta contém um período.

$ find -maxdepth 1 -type d -print0 |
   grep -z -v -Ee 'sensors|\.test' |
   xargs.exe -0 -I% find % -name '*.java' |
   sort
  ./dirz/3.java
  ./dirz/3.java
  ./foo/2.java
  ./foo/2.java
  ./moo/1.java
  ./moo/1.java

É melhor fazer algo assim:

$ find . -type f -name \*java | grep -v -Ee './(sensors|\.test)'
./dirz/3.java
./foo/2.java
./moo/1.java

Ou até mesmo:

$ echo dirz foo moo | tr \  \n  > .search-dirs

$ find 'cat .search-dirs' -type f -name \*java
dirz/3.java
foo/2.java
moo/1.java
    
por 24.07.2013 / 06:13
1

Use a opção xargs ' -i , que, como na opção find do -exec , substitui {} pelos caminhos.

... | xargs -i find "{}" -name '*.java'
    
por 24.07.2013 / 05:49
1

Você pode fazer isso diretamente em find ; não há necessidade de envolver grep ou xargs .

Com uma estrutura de diretórios como:

$ ls *
a_sensors_directory:
my_file.java  my_non_java_file.txt

a_sensors_directory.test:
my_file.java  my_non_java_file.txt

something_else:
my_file.java  my_non_java_file.txt

, este comando GNU find selecionará os arquivos que terminam em .java nos diretórios no diretório de trabalho atual que contêm a palavra sensors , mas não termina em .test (se eu interpretei sua pergunta corretamente):

$ find -type f -ipath './*sensors*' -not -ipath './*.test/*' -iname '*.java'
./a_sensors_directory/my_file.java

man find deve explicar os switches claramente e provavelmente melhor do que eu.

O encanamento é poderoso, mas as ferramentas básicas lidam com muitos cenários de maneira mais direta. Isso evita forks de processo desnecessários e mantém os erros sutis ao mínimo.

    
por 24.07.2013 / 11:33