次のファイルを含むディレクトリがあります。
aaaXXXbbb.png
aaaYYYccc.png
xxxAAAyyy.png
yyyAAAxxx.png
シェルスクリプトを使用して、プレフィックス「aaa」とサフィックス「.png」を含むすべてのファイルを新しいディレクトリにコピーしたいと思います。 2つのファイル「aaaXXXbbb.png」と「aaaYYYccc.png」を考えてみましょう。
ベストアンサー1
cp aaa*.png /some/destdir
これは、文字列で始まり文字列で終わるaaa
すべてのファイル名と一致し、.png
すべてディレクトリにコピーされます/some/destdir
。*
名前の真ん中にあるすべての文字と一致します。
このパターンに一致する数千のファイルがあると、結果リストが長すぎるため、この操作は失敗します。
この場合は、次のループのようなものを使用してください。
for name in aaa*.png; do
cp "$name" /some/destdir
done
これにより、ファイルが1つずつコピーされます。
何千ものファイルに対するより効率的なアプローチは次のとおりです(GNUcp
とその-t
オプションを使用)。
find . -maxdepth 1 -type f -name 'aaa*.png' -exec cp -t /some/destdir {} +
または(GNUなしcp
):
find . -maxdepth 1 -type f -name 'aaa*.png' -exec sh -c 'cp "$@" /some/destdir' sh {} +
最後のコマンドは、現在のディレクトリで名前がパターンと一致するすべての一般的なファイルを探しfind
、これらのファイルの配置に対して短いインラインシェルスクリプトを呼び出します。短いインラインシェルスクリプトは、現在のバッチ(適切で管理可能なファイル数)のファイルをターゲットディレクトリにコピーします。-type f
-maxdepth 1
aaa*.png
find
使用に関する追加情報-exec
:「find」の-execオプションについて