ファイルの多いフォルダがあります。次の名前(スペースで区切り)で始まるすべてのファイルをコピーしたいと思います。
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
各インクルードが一度呼び出されるため、速度が遅くなる可能性があります。もう一つの方法は、配列を埋めてそこから始めることです(ここ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つのグローブを拡張する必要があることを意味します。つまり、ファイル全体のリストを2回インポートして、どのファイルがパターンと2回一致するかを確認する必要があります。
zsh
これは、globがファイルと一致しない場合、コマンド全体がキャンセルされることを意味します(cshnullglob
cshのようにオプションを実行するように有効にすることでこの問題を解決できます)。
これは次のことも意味します。
cp {a,ab}* /dest
cp
ファイルが2回コピーされますab*
。
これは以下とは異なります。
cp @(a|b)* /dest
またはksh
bash -O extglob
zsh -o kshglob
cp (a|b)* /dest
のzsh
。そこだけ一つglobはより効率的で、ファイルは一度だけ含まれています。
zsh
配列にプレフィックスリストがある場合に使用します。
prefixes=(abc abd aer ab-x ate)
cp -- (${(j:|:)~prefixes})* /dest
(上記では、プレフィックスはワイルドカードとして扱われます。)つまり、配列の要素を連結し、|
結果をglob(~
)として扱います。
リストが大きいと、次のようにcp
実行が失敗する可能性があります。「パラメータリストが長すぎます」間違い。この場合、zsh
module() をロードして組み込みバージョンを使用できます。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 # ファイル名にスペースは必要ありません。
またはより良い、
-r ファイルを読み込むときに cp "$file" dest/ を実行します。
メモ:
- "$file" 空白のある名前を処理できるからです。
One Package.deb
-r
エスケープシーケンスからユーザーを保護します。-r バックスラッシュはエスケープ文字として機能しません。バックスラッシュは行の一部と見なされます。特に、バックスラッシュ - 改行ペアは行連続文字としては使用できません。