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

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

たくさんのファイルが入っているフォルダがあります。次の名前で始まるすべてのファイルをコピーします (スペースで区切る):

abc abd aer ab-x ate

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

答え1

csh、、、、またはtcshを使用するksh93bashfishzsh -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 回呼び出されるため、処理が遅くなる可能性があります。これを行う別の方法は、配列にデータを入力して、そこから実行することです (ここksh93zshまたは最近の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組み込みバージョンを使用できます。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 # ファイル名に空白は必要ありません

    あるいは、

    while read -r file; do cp "$file" dest/ ; done < list0.txt

ノート:

  • 「$file」なので、空白を含む名前を次のように処理できます。One Package.deb
  • -rエスケープシーケンスから保護します。

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

関連情報