名前に数字20〜32を含むファイルをコピーする方法

名前に数字20〜32を含むファイルをコピーする方法

copyDestからPastDestに20から32までの数字を含むファイルをコピーしたいです。私は何が間違っていましたか?

cp -r ~/copyDest/*2[0-9]|3[0-2]* ~/pasteDest

ありがとうございます。

ベストアンサー1

|パイプライン演算子です。

cp -r ~/copyDest/*2[0-9]|3[0-2]* ~/pasteDest

globで拡張された最初のファイルと呼ばれるコマンドcpにパイプされたコマンド。グローバル代替演算子3[0-2]*になるには、in(ただし、数値範囲一致のための専用演算子を含む)とin(またはwith on)が|必要です。(...)zshzsh@(...)kshbashextglob

したがってzsh

cp -r ~/copyDest/(*[^0-9]|)<20-32>(|[^0-9]*) ~/pasteDest

それ以外の場合は(*[^0-9]|)foo120とも一致します。

kshor(またはinside)または(within)を使用すると、そのbash -O extglob項目(ファイルがコピーされる順序を除く)は次のようになります。shopt -s extglobbashzsh -o kshglobset -o kshglobzsh

(
  LC_ALL=C
  cp -r ~/copyDest/?(*[^0-9])*(0)@(2[0-9]|3[0-2])?([^0-9]*) ~/pasteDest
)

kshまたはbashの場合、ほとんどのシステムとCを除くほとんどのロケールでは、[0-9]0123456789よりも多くの文字が一致するためLC_ALL=C(これはglob拡張ソート順序にも影響します)、ファイル名にASCII文字のみが含まれている場合は省略できます。一般システムのロケールには、0123456789以外のASCII文字が含まれるとは思わないからです[0-9]。他の選択肢[0-9]はで置き換えることです[0123456789]

またzsh -o kshglob、パターンがin以外のファイルと一致しない場合は、cpリテラル引数(有効だがある可能性がないファイル名)を使用して呼び出され.../?(*[^0-9])*(0)@(2[0-9]|3[0-2])?([^0-9]*)、存在する場合はコピーされます(cpそうでなければ誤って返されます)。bashこのオプションを使用するとfailglob、より正常な動作に近づくことができますzsh(パターンが一致しない場合はコマンドをキャンセル)。

foo20.txt上記では、名前の付いたファイルのコピーに特別な注意を払いました。foo00020.txtただし、名前foo120.txtまたはファイルはコピーされませんでしたfoo200.txt(名前に20が含まれていても)。それでもfoo32.12.txtまたはfoo-1E-20.txtファイルをコピーしますfoo0x20.txt

foo120それでもコピーしたりファイルに保存したりすると、はるかにfoo200簡単になります。

  • zsh:

    cp -r ~/copyDest/*<20-32>* ~/pasteDest
    
  • bash -O extglob協力:

    cp -r ~/copyDest/*@(2[0123456789]|3[012])* ~/pasteDest
    

おすすめ記事