O segundo exemplo:
find . -name '*.txt' -print0 | xargs -0 cat > out.txt
É completamente legal e recriará o arquivo, out.txt
cada vez que for executado, enquanto o primeiro concatenará para out.txt
se for executado. Mas ambos os comandos estão fazendo essencialmente a mesma coisa.
O que causa confusão é o xargs -0 cat
. As pessoas acham que o redirecionamento para out.txt
faz parte desse comando quando não é. O redirecionamento está ocorrendo após xargs -o cat
ter recebido entrada via STDIN e, depois, enviado essa saída como um fluxo único para STDOUT. O xargs
está otimizando o envio dos arquivos e não sua saída.
Aqui está um exemplo que mostra o que estou dizendo. Se inserirmos um pv -l
entre o xargs -0 cat
e a saída para o arquivo out.txt
, poderemos ver quantas linhas o cat escreveu.
Exemplo
Para mostrar isso, criei um diretório com 10.000 arquivos.
for i in 'seq -w 1 10000';do echo "contents of file$i.txt" > file$i.txt;done
Cada arquivo é semelhante a este:
$ more file00001.txt
contents of file00001.txt
A saída de pv
:
$ find . -name '*.txt' -print0 | xargs -0 cat | pv -l > singlefile.rpt
10k 0:00:00 [31.1k/s] [ <=>
Como podemos ver, 10 mil linhas foram escritas no meu arquivo singlefile.rpt
. Se xargs
estivesse passando nos grupos de saída, veríamos isso reduzindo o número de linhas que estavam sendo apresentadas para pv
.