Não é possível concatenar arquivos com find ./subdir/* -print0 | classificar | xargs -0 cat merge.txt

2

Estou tentando concatenar milhares de arquivos resultantes do processamento da saída de peças por split com

find ./subdir/* -print0 | sort | xargs -0 cat > full_merge.txt

Os arquivos em subdir são:

something.foo.aaaaa.output
something.foo.aaaab.output
something.foo.aaaac.output

...

Mas recebo File name too long

Por quê?

    
por Amelio Vazquez-Reina 28.05.2013 / 16:31

2 respostas

4

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.

    
por 28.05.2013 / 18:37
2
O argumento

xargs ' -0 é para quando a entrada é separada por NUL, o que não é. Se você quiser que isso funcione, você tem que separar com NULs nos comandos anteriores. Infelizmente, não parece haver nenhuma maneira de fazer isso POSIX compatível :

find ./subdir/* -print0 | sort -z | xargs -0 cat -- > full_merge.txt
    
por 28.05.2013 / 16:44

Tags