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.