特定の名前のファイルを別のフォルダにコピーする

特定の名前のファイルを別のフォルダにコピーする

ファイルの多いフォルダがあります。次の名前(スペースで区切り)で始まるすべてのファイルをコピーしたいと思います。

abc abd aer ab-x ate

別のフォルダに。どうすればいいですか?

答え1

csh、、、、と組み合わせて使用tcsh​​できksh93ます。bashfishzsh -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がファイルと一致しない場合、コマンド全体がキャンセルされることを意味します(cshnullglobcshのようにオプションを実行するように有効にすることでこの問題を解決できます)。

これは次のことも意味します。

cp {a,ab}* /dest

cpファイルが2回コピーされますab*

これは以下とは異なります。

cp @(a|b)* /dest

またはkshbash -O extglobzsh -o kshglob

cp (a|b)* /dest

zsh。そこだけ一つglobはより効率的で、ファイルは一度だけ含まれています。

zsh配列にプレフィックスリストがある場合に使用します。

prefixes=(abc abd aer ab-x ate)
cp -- (${(j:|:)~prefixes})* /dest

(上記では、プレフィックスはワイルドカードとして扱われます。)つまり、配列の要素を連結し、|結果をglob(~)として扱います。

リストが大きいと、次のようにcp実行が失敗する可能性があります。「パラメータリストが長すぎます」間違い。この場合、zshmodule() をロードして組み込みバージョンを使用できます。cpzsh/fileszmodload zsh/files

答え3

  1. たとえば、現在のディレクトリに次のファイルがあります。

    1-s2.0-S0038092X0000058X-main.pdf  ANNDHW.pdf     HPcalculation2
    1-s2.0-S0306261999000422-main.pdf  ANNlee.pdf     HPcalculation3
    ANNCanada.pdf                      HPcalculation  HPcalculation4
    
  2. HPで始まるすべてのファイルを次のフォルダに移動したいと思います。./NewFolder/

  3. 私はできます:

    cp ./HP* ./NewFolder/
    

    ./HP*私はHPから始まるすべてのファイルに興味があるとLinuxに知らせます。代わりにすべてをに移動したい場合は、次のように入力でき.pdfます。*.pdf

    cp ./*.pdf ./NewFolder/
    

答え4

簡単にできます

 cp abc* abd* aer* ab-x* ate*  DestinationPath

スケーリング問題の解決策は次のとおりです。

  1. すべてのファイル名をリストに入れます(例:list0.txt)。
  2. すべてコピー

    cp `cat list0.txt` DestinationPath # ファイル名にスペースは必要ありません。

    またはより良い、

    -r ファイルを読み込むときに cp "$file" dest/ を実行します。

メモ:

  • "$file" 空白のある名前を処理できるからです。One Package.deb
  • -rエスケープシーケンスからユーザーを保護します。

    -r バックスラッシュはエスケープ文字として機能しません。バックスラッシュは行の一部と見なされます。特に、バックスラッシュ - 改行ペアは行連続文字としては使用できません。

関連情報