前提

前提

などの名前のファイルが約15,000個ありますfile_1.pdbfile_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

findsortおよびxargs:を使用してください。

find . -maxdepth 1 -type f -name 'file_*.pdb' -print0 |
sort -zV |
xargs -0 cat >all.pdb

このfindコマンドはすべての関連ファイルを見つけ、sort「バージョンソート」を実行してパス名を印刷して正しい順序で取得します(ファイル名の数字がすでに固定幅で0で埋められている場合は必要ありません-V)。xargsこのソートされたパス名のリストを取得し、catできるだけ大きなバッチで実行します。

これは、ファイル名に奇妙な文字(改行やスペースなど)が含まれている場合にも機能します。-print0with を使用してfindnulsortで終わる名前をソートし、sortこれらの名前を処理するために使用します-zxargsまた、対応するフラグを使用してnullで終わる名前を読みます-0

名前がパターンと一致しないファイルに結果を書き込んでいることに注意してくださいfile_*.pdb


上記の解決策は、いくつかのユーティリティに対して非標準フラグを使用します。これらのユーティリティのGNU実装と、少なくともOpenBSDとmacOSの実装はこれらの機能をサポートします。

使用される非標準フラグは次のとおりです。

  • -maxdepth 1findサブディレクトリではなく最上位ディレクトリにのみ入ります。 POSIXly、使用find . ! -name . -prune ...
  • -print0find出力がnullで終わるパス名になります(POSIXでは考慮されますが拒否されます)。代わりに使用できます-exec printf '%s\0' {} +
  • -z、nullで終わるレコードを取得しますsort。 POSIXに該当するものはありません。
  • -Vsort並べ替え(たとえば2003.POSIXと同等ではありませんが、ファイル名に固定接頭辞がある場合は、ファイル名の特定の部分を数値順に置き換えることができます。
  • -0, xargsnull で終わるレコードを読み込みます。 POSIXに該当するものはありません。 POSIXlyではxargs

-Vパス名が正しく機能し、ディレクトリ構造が単純(サブディレクトリなし)の場合を除き、これらのフラグは使用できませんsort

おすすめ記事