たくさんのファイルが入っているフォルダがあります。次の名前で始まるすべてのファイルをコピーします (スペースで区切る):
abc abd aer ab-x ate
別のフォルダに。どうすればいいですか?
答え1
csh
、、、、またはtcsh
を使用するksh93
とbash
、fish
zsh -o cshnullglob
ブレース拡張そしてグロビングそのためには(--
これらのファイル名には必要ありませんが、これらは単なる例であると想定しています):
cp -- {abc,abd,aer,ab-x,ate}* dest/
中括弧の展開を使用したくない場合は、 for ループを使用できます (ここでは POSIX/Bourne スタイルの構文)。
for include in abc abd aer ab-x ate; do
cp -- "$include"* dest/
done
ファイルが非常に多い場合、cp
インクルードごとに が 1 回呼び出されるため、処理が遅くなる可能性があります。これを行う別の方法は、配列にデータを入力して、そこから実行することです (ここksh93
、zsh
または最近のbash
構文)。
files=()
includes=(abc abd aer ab-x ate)
for include in "${includes[@]}"; do
files+=( "$include"* )
done
cp -- "${files[@]}" dest/
答え2
ブレース拡張とグロブに関する注意事項。
括弧の展開はグロブではありません(ただし、csh/tcshでは他のシェルほど明確な区別はありません)。前にグロビング。
そのため、次の操作を実行します。
cp {a,b}* /dest
まず次のように拡張されます。
cp a* b* /dest
つまり、シェルは 2 つの glob を展開する必要があり、ファイルの完全なリストを 2 回取得し、パターンに一致するものを 2 回確認する必要があります。
のzsh
場合、glob のいずれかがどのファイルにも一致しない場合は、コマンド全体がキャンセルされることも意味します (csh のように動作するオプションを有効にすることで、これを回避できますcshnullglob
)。
それはまた、もしあなたが
cp {a,ab}* /dest
cp
ファイルを2回コピーしますab*
。
それは以下とは異なります:
cp @(a|b)* /dest
またはksh
または、bash -O extglob
またはzsh -o kshglob
cp (a|b)* /dest
のzsh
。そこには、1つglob なので、効率が上がり、ファイルは 1 回だけ含められるようになります。
を使用するzsh
と、配列内にプレフィックスのリストがある場合:
prefixes=(abc abd aer ab-x ate)
cp -- (${(j:|:)~prefixes})* /dest
(上記では、プレフィックスはグロブとして扱われます)。つまり、配列の要素を で結合し|
、その結果をグロブ ( ~
) として扱います。
リストが大きい場合、実行がcp
失敗し、「引数リストが長すぎます」エラー。その場合は、モジュール ( )をロードすることで、zsh
組み込みバージョンを使用できます。cp
zsh/files
zmodload zsh/files
答え3
たとえば、現在のディレクトリに次のファイルがあります。
1-s2.0-S0038092X0000058X-main.pdf ANNDHW.pdf HPcalculation2 1-s2.0-S0306261999000422-main.pdf ANNlee.pdf HPcalculation3 ANNCanada.pdf HPcalculation HPcalculation4
HP から始まるすべてのファイルを次のフォルダーに移動します:
./NewFolder/
できます:
cp ./HP* ./NewFolder/
./HP*
これは、HP で始まるすべてのファイルに興味があることを Linux に伝えます。逆に、 で終わるすべてのファイルを移動したい場合は、の前に.pdf
を付けます。*
.pdf
cp ./*.pdf ./NewFolder/
答え4
簡単にできる
cp abc* abd* aer* ab-x* ate* DestinationPath
拡大した問題の解決策は
- すべてのファイル名をリストに入れる(例:list0.txt)
すべてコピー
cp `cat list0.txt` DestinationPath # ファイル名に空白は必要ありません
あるいは、
while read -r file; do cp "$file" dest/ ; done < list0.txt
ノート:
- 「$file」なので、空白を含む名前を次のように処理できます。
One Package.deb
-r
エスケープシーケンスから保護します。-r バックスラッシュはエスケープ文字として機能しません。バックスラッシュは行の一部とみなされます。特に、バックスラッシュと改行の組み合わせは行の継続として使用できません。