次のファイルを含むディレクトリがあります。
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オプションについて
答え2
ライナーを使用すると、次のことができます。
grep '^aaa.*\.png$' list.txt | xargs -I '{}' cp '{}' destination_dir/
grep
行の先頭で「aaa」を探し、その後に0個以上の文字が続き、「.png」で終わります。その後、パラメータリストとして「destination_dir」にcp
パイプします。
ファイルディレクトリにある場合は、cp
次のコマンドを使用できます。
cp aaa*.png destination_dir
答え3
そしてfind
:
find . -maxdepth 1 -type f -name aaa\*.png -exec cp {} destination \;
.
現在のディレクトリを表します。
-maxdepth 1
現在のディレクトリのみを表示するように指示
type -f
ファイルを検索するように指示
-name aaa\*.png
aaa
次に始まり終わるファイルを示します。.png
-exec cp {} destination \;
ファイルを名前付きディレクトリにコピーしますdestination
。
私の環境ではを*
使用する必要があります\
。ご使用の環境ではこれが不要な場合がありますのでご利用いただけます。aaa*.png