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 -0
NULで区切られたレコードが必要です。したがって、GNUソートを使用すると、出力は追加の改行文字で構成された偽要素によって生成されたリストと同じリストとして扱われxargs
ます。sort
find -print0
sort
busyboxの場合、sort
すべてのNULが改行に変換されたため、既知のレコードは1つしかないため、改行を含む巨大なファイル名で呼び出されますxargs -0
。cat
ここでファイル名のリストを並べ替えるには、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