find ./subdir/* -print0 接続ファイルのソートは使用できません。 xargs -0 cat > merge.txt

find ./subdir/* -print0 接続ファイルのソートは使用できません。 xargs -0 cat > merge.txt

split次から出力されたフラグメントを処理して、生成された何千ものファイルをリンクしようとしています。

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

次のファイルは次subdir のとおりです。

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

...

しかし、私は理解していますFile name too long

なぜ?

答え1

なぜこのエラーが発生するのかわかりません。

find ./subdir/* -print0

--print0タイプミスと仮定)一部のNUL文字を含む終了していない大きな行を出力します。改行文字で終わらず NUL 文字が含まれているため、テキストではないため、テキストユーティリティ (例:) の動作はsort指定されません。これを1つの大きな行として扱い、欠落している改行文字を再追加するGNUソート。

sortおそらく私が知っている限り、入力のNUL文字を行区切り文字として扱いますが、出力行は改行で終わるbusyboxを使用している可能性があります。

xargs -0NULで区切られたレコードが必要です。したがって、GNUソートを使用すると、出力は追加の改行文字で構成された偽要素によって生成されたリストと同じリストとして扱われxargsます。sortfind -print0sort

busyboxの場合、sortすべてのNULが改行に変換されたため、既知のレコードは1つしかないため、改行を含む巨大なファイル名で呼び出されますxargs -0cat

ここでファイル名のリストを並べ替えるには、GNUsortとその-zオプションを使用する必要があります。

find subdir -type f -print0 | sort -z | xargs -r0 cat > merge.txt

または、ファイル名に改行文字が含まれていないとし、次のように実行します。

find subdir -type f | sort | tr '\n' '\0' | xargs -r0 cat > merge.txt

タグを使用しているので、次のzshことをすべて実行できますzsh

autoload zargs
zargs subdir/**/*(D.) -- cat > merge.txt

これにより、実際に目的のアイテムに近いソート順序が提供されます。

答え2

xargs'-0パラメータは、次の場合に適用されます。入力するNULで区切られていますが、そうではありません。これを行うには、前のコマンドをNULで区切る必要があります。残念ながら、これを行う方法はないようです。POSIX互換:

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

関連情報