Faz diferença se eu uso um valor de sinalizador -n diferente para xargs em combinação com o comando find?

0

Suponha que alguém procure por arquivos que correspondam a alguns critérios usando o comando find e canalize o resultado para o comando rm.

find / -type f -name "*.jpg" | xargs rm 

Primeiro, não tenho certeza se o comando acima receberá um erro se o número de arquivos encontrados for muito grande, porque acho que há um limite para o número de argumentos que um comando como o rm pode conter.

Então, eu sei que posso definir quantos arquivos são passados como argumentos de uma vez para o rm. Xargs com -n3 passariam, por exemplo, três argumentos para rm executar o comando e repeti-lo até que todos os arquivos tenham sido passados como argumentos.

Agora, isso faz alguma diferença com relação ao valor que eu tomo para a opção -n do xargs? Estas linhas de comando diferem em algum aspecto, como por exemplo a duração da execução:

find / -type f -name "*.jpg" | xargs rm 

find / -type f -name "*.jpg" | xargs -n1 rm 

find / -type f -name "*.jpg" | xargs -n2 rm 

find / -type f -name "*.jpg" | xargs -n3 rm

.
.
.

find / -type f -name "*.jpg" | xargs -n999 rm  
    
por Abdul Al Hazred 24.03.2015 / 21:59

2 respostas

1

A limitação mencionada é geralmente sobre o buffer exec usado, não específico para comandos individuais. A finalidade de xargs é exatamente para resolver esse problema; xargs terá tantos argumentos quanto possível para alimentar o comando. Isso fará com que você receba menos chamadas de comando e, portanto, um bom desempenho. Reduzir a quantidade de argumentos para o comando especificando explicitamente -n não ganhará nada a esse respeito. Você pode usar -n , por exemplo nos casos em que os comandos esperam um número específico de argumentos, com o caso especial em que o comando pode ser chamado uma vez para cada argumento. (Observe que find tem também uma opção -exec e um terminador especial + para facilitar um comportamento semelhante.)

    
por 24.03.2015 / 22:13
0

Desde que fiz uma pergunta semelhante: Isso fez diferença quando eu chamei o md5sum recursivamente:

time find -type f -print0 | ...
... xargs -0 --max-procs 0 md5sum  37,98s user 2,45s system 99% cpu 40,464 total
... xargs -0 -n100 --max-procs 0 md5sum  41,18s user 2,66s system 327% cpu 13,374 total
... xargs -0 -n10 --max-procs 0 md5sum  45,20s user 2,93s system 573% cpu 8,396 total
... xargs -0 -n1 --max-procs 0 md5sum  45,90s user 3,01s system 591% cpu 8,263 total

find -type f -exec md5sum {} \;  37,87s user 2,62s system 99% cpu 40,596 total

Como você pode ver, o parâmetro -n é a única coisa que me acelera

    
por 30.09.2018 / 11:17