などの名前のファイルが約15,000個ありますfile_1.pdb
。file_2.pdb
次のようにして、約数千のファイルを順番に並べ替えることができます。
cat file_{1..2000}.pdb >> file_all.pdb
ただし、15,000個のファイルでこれを実行するとエラーが発生します。
-bash: /bin/cat: Argument list too long
私はこれを実行してこの問題が解決するのを見ましたが、find . -name xx -exec xx
これはファイルの関連付け順序を維持しません。この目標をどのように達成できますか?
ベストアンサー1
find
、sort
およびxargs
:を使用してください。
find . -maxdepth 1 -type f -name 'file_*.pdb' -print0 |
sort -zV |
xargs -0 cat >all.pdb
このfind
コマンドはすべての関連ファイルを見つけ、sort
「バージョンソート」を実行してパス名を印刷して正しい順序で取得します(ファイル名の数字がすでに固定幅で0で埋められている場合は必要ありません-V
)。xargs
このソートされたパス名のリストを取得し、cat
できるだけ大きなバッチで実行します。
これは、ファイル名に奇妙な文字(改行やスペースなど)が含まれている場合にも機能します。-print0
with を使用してfind
nulsort
で終わる名前をソートし、sort
これらの名前を処理するために使用します-z
。 xargs
また、対応するフラグを使用してnullで終わる名前を読みます-0
。
名前がパターンと一致しないファイルに結果を書き込んでいることに注意してくださいfile_*.pdb
。
上記の解決策は、いくつかのユーティリティに対して非標準フラグを使用します。これらのユーティリティのGNU実装と、少なくともOpenBSDとmacOSの実装はこれらの機能をサポートします。
使用される非標準フラグは次のとおりです。
-maxdepth 1
、find
サブディレクトリではなく最上位ディレクトリにのみ入ります。 POSIXly、使用find . ! -name . -prune ...
-print0
、find
出力がnullで終わるパス名になります(POSIXでは考慮されますが拒否されます)。代わりに使用できます-exec printf '%s\0' {} +
。-z
、nullで終わるレコードを取得しますsort
。 POSIXに該当するものはありません。-V
、sort
並べ替え(たとえば200
、3
.POSIXと同等ではありませんが、ファイル名に固定接頭辞がある場合は、ファイル名の特定の部分を数値順に置き換えることができます。-0
,xargs
null で終わるレコードを読み込みます。 POSIXに該当するものはありません。 POSIXlyではxargs
。
-V
パス名が正しく機能し、ディレクトリ構造が単純(サブディレクトリなし)の場合を除き、これらのフラグは使用できませんsort
。