Como canalizar a saída de find para outra invocação de localização

2

Veja o que estou tentando fazer

find . -maxdepth 1 -type d -print0 | xargs -0 -P4 find -name 'war' -type d

Eu gostaria de criar uma lista de nomes de diretório, terminados em null, e então passar essa lista para xargs, que para cada nome de diretório chama encontrar usando um conjunto de 4 processos.

Meu problema é: Como eu acesso o stdin no comando piped-to find? Algo como

find <STDIN> -name 'war' -type d
    
por helpermethod 05.11.2014 / 11:21

2 respostas

0

use isso:

find . -maxdepth 1 -type d -print0 |
xargs -0 -I {} -P4 find "{}" -name "war" -type d

A melhor maneira é excluir . path:

find . -maxdepth 1 -not -path .  -type d -print0 |
xargs -0 -I "{}"  find "{}" -name "war" -type d
    
por 05.11.2014 / 12:43
3

Localizar não pode ler seu caminho de stdin, você não pode especificar - como com muitos outros programas.

Eu recomendo que você use o GNU paralelo para executar coisas paralelamente:

find . -mindepth 1 -maxdepth 1 -type d -print0  | parallel -0 --jobs 4 \
    find {} -name "war" -type d

Por favor, note o -mindepth 1 adicionado ao primeiro achado. Se você não incluir isso, o diretório atual ( . ) será passado para uma das descobertas também e você obterá resultados duplos.

$ mkdir a b c d e
$ mkdir b/war c/war
$ find . -mindepth 1 -maxdepth 1 -type d -print0  | parallel -0 --jobs 4 \
    find {} -name "war" -type d
./b/war
./c/war
$ find . -maxdepth 1 -type d -print0  | parallel -0 --jobs 4 \
    find {} -name "war" -type d
./c/war
./b/war
./c/war
./b/war
    
por 05.11.2014 / 12:47

Tags