名前に数字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
    

答え2

シェルパターンマッチングに関するマニュアルを読んでおらず、それが通常「正規表現」と呼ばれるものと同じであると仮定しました。例で使用した演算子の意味が異なることは、*その演算子が異なることを意味します。

Bash(および他のいくつかのシェル)では、{,}演算子を使用して目的の効果を得ることができます。

cp -r ~/copyDest/*{2[0-9],3[0-2]}* ~/pasteDest

しかし、違いがあることに注意してください。書くのと同じです。

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

つまり、どちらのパターンも一致しない場合は引数として渡され、cpファイルcpが存在しないと文句を言います。nullglobこのような状況を避けるために、シェルオプションを設定できます。

答え3

bash方法。ボーナスとして、一致するファイルが見つからなかった番号を印刷します。

[steve@instance-2 ~]$ find copyDest pasteDest
copyDest
copyDest/file15
copyDest/file20
copyDest/file25
copyDest/file32
copyDest/file33
pasteDest
[steve@instance-2 ~]$ cp -pr ~/copyDest/*{20..32}* pasteDest
cp: cannot stat ‘/home/steve/copyDest/*21*’: No such file or directory
cp: cannot stat ‘/home/steve/copyDest/*22*’: No such file or directory
cp: cannot stat ‘/home/steve/copyDest/*23*’: No such file or directory
cp: cannot stat ‘/home/steve/copyDest/*24*’: No such file or directory
cp: cannot stat ‘/home/steve/copyDest/*26*’: No such file or directory
cp: cannot stat ‘/home/steve/copyDest/*27*’: No such file or directory
cp: cannot stat ‘/home/steve/copyDest/*28*’: No such file or directory
cp: cannot stat ‘/home/steve/copyDest/*29*’: No such file or directory
cp: cannot stat ‘/home/steve/copyDest/*30*’: No such file or directory
cp: cannot stat ‘/home/steve/copyDest/*31*’: No such file or directory
[steve@instance-2 ~]$ find copyDest pasteDest
copyDest
copyDest/file15
copyDest/file20
copyDest/file25
copyDest/file32
copyDest/file33
pasteDest
pasteDest/file20
pasteDest/file25
pasteDest/file32
[steve@instance-2 ~]$

答え4

正規表現一致ではなくパターン一致を実行する必要があります。シェルのマニュアルページを確認してください。次のことを試してください

ls  *2[0-9]* *3[0-2]*

すなわち、2つのモードを設けることにより交番が行われる。

関連情報