Não sei por que você recebeu esse erro.
find ./subdir/* -print0
(assumindo que --print0
era um erro de digitação) produziria uma grande linha não terminada com alguns caracteres NUL. Porque não termina em um caractere de nova linha e porque contém caracteres NUL, não é texto, então o comportamento de utilitários de texto como sort
não é especificado lá. O GNU sort, trataria isso como uma grande linha e adicionaria de volta a nova linha que faltava.
Talvez você esteja usando o busybox sort
que, até onde eu sei, trata esses caracteres NUL na entrada como separadores de linha, mas gera linhas terminadas por caracteres de nova linha.
xargs -0
espera registros separados por NUL. Portanto, com a classificação GNU, xargs
trataria a saída sort
como a mesma lista gerada por find -print0
plus no elemento espúrio que consiste no caractere extra de nova linha adicionado por sort
.
No caso de busybox sort
, como todos os NULs foram convertidos em novas linhas, existe apenas um registro para xargs -0
, portanto, chamará cat
com um nome de arquivo enorme contendo caracteres de nova linha. / p>
Aqui, se você quiser classificar a lista de nomes de arquivos, você precisa usar o GNU sort
com sua opção -z
:
find subdir -type f -print0 | sort -z | xargs -r0 cat > merge.txt
Ou presuma que nomes de arquivos não contêm caracteres de nova linha e são executados:
find subdir -type f | sort | tr '\n' 'autoload zargs
zargs subdir/**/*(D.) -- cat > merge.txt
' | xargs -r0 cat > merge.txt
Como você usou a tag zsh
, é melhor fazer tudo em zsh
:
find ./subdir/* -print0
O que, na verdade, fornecerá uma ordem de classificação mais próxima do que você está procurando.