Xargs passam a entrada para o comando que contém um pipe

2

Como um veículo para entender como manipular precedência de ligação com pipes, estou tentando imprimir o caminho de um arquivo por diretório - para cada diretório:

find $PWD -type d | xargs --delimiter "\n" -I% -n 1 (find % -maxdepth 1 | head -1)

Eu recebo no matches found: (find % -maxdepth 1 | head -1) . Sem os colchetes, eu obteria xargs: find: terminated by signal 13 , então tenho certeza de que precisamos de alguma forma tornar os canos apropriados para a associação.

Como faço para passar a entrada xargs para um comando que contém pipes? (por favor, não me diga para usar -exec , eu quero aprender como manipular a precedência de ligação para outros problemas).

    
por Sridhar-Sarnobat 16.08.2016 / 23:45

3 respostas

2

Aqui você está com xargs:

find . -type d|xargs -I % sh -c 'find % -type f -maxdepth 1 | head -1'

Mas lembre-se: o loop interno é muito mais rápido!

time find $PWD -type d | while read dir;do find $dir -type f -maxdepth 1 | head -1;done >/dev/null                                                                                       
    0m09.62s real     0m01.67s user     0m02.36s system
time find . -type d|xargs -I % sh -c 'find % -type f -maxdepth 1 | head -1' >/dev/null                                                                                                   
    0m12.85s real     0m01.84s user     0m02.86s system
    
por 17.08.2016 / 00:32
0

Pessoalmente, não gosto de xargs

find $PWD -type d | while read dir;do find $dir -type f -maxdepth 1 | head -1;done
    
por 16.08.2016 / 23:58
0

E esta é a solução mais rápida com tudo interno:

time find . -type d | while read dir;do for file in "$dir"/*;do if [ -f "$file" ]; then realpath $file;break;fi;done;done >/dev/null
    0m00.21s real     0m00.08s user     0m00.10s system

Velocidade imbatível no shell. (Eu disse que não gosto de xargs)

    
por 17.08.2016 / 00:39

Tags