システムコマンドの引数リストの長さには最大の制限があります。この制限はMAX_ARG_PAGES
、カーネルのコンパイル時の値に基づいて分布固有であり、カーネルを再コンパイルしないと変更できません。
シェルによるグロビングの処理方法により、同じ引数( "* .jpg")を使用すると、ほとんどのシステムコマンドに影響します。globは最初にシェルによって処理されてからコマンドに送信されるため、コマンドは次のようになります。
cp -uf *.jpg /targetdir/
シェルと本質的には、次のように記述します。
cp -uf 1.jpg 2.jpg ... n-1.jpg n.jpg /targetdir/
多くのjpegを扱っている場合、これは非常に迅速に管理不能になる可能性があります。命名規則と実際に処理する必要があるファイルの数に応じて、一度にディレクトリの異なるサブセットでcpコマンドを実行できます。
cp -uf /sourcedir/[a-m]*.jpg /targetdir/
cp -uf /sourcedir/[n-z]*.jpg /targetdir/
これは機能する可能性がありますが、ファイルリストを便利なグロブ可能ブロックにどれだけうまく分割できるかに基づいて、正確にどれだけ効果があるかが決まります。
グロッバブル。私はその言葉が好きです。
findやxargsなどの一部のコマンドは、非常に大きなサイズの引数リストを作成せずに大きなファイルリストを処理できます。
find /sourcedir/ -name '*.jpg' -exec cp -uf {} /targetdir/ \;
-exec引数は、findで見つかったファイルごとにコマンドラインの残りを1回実行し、{}を見つかった各ファイル名に置き換えます。以来のcpコマンドは一度に1つのファイル上で実行され、引数リストの制限は問題ではありません。
これは、各ファイルを個別に処理する必要があるため、時間がかかる場合があります。xargsを使用すると、より効率的なソリューションを提供できます。
find /sourcedir/ -name '*.jpg' -print0 | xargs -0 cp -uf -t /destdir/
xargsがが提供する完全なファイルリスト取ることができます検索し、かつ管理可能なサイズと、ランの引数リストの中にそれを打破CPこれらのサブリストのそれぞれに。
もちろん、カーネルに再コンパイルして、より大きな値を設定する可能性もありますMAX_ARG_PAGES
。しかし、カーネルの再コンパイルは、この回答で説明するよりも多くの作業です。