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)が|
必要です。(...)
zsh
zsh
@(...)
ksh
bash
extglob
したがってzsh
:
cp -r ~/copyDest/(*[^0-9]|)<20-32>(|[^0-9]*) ~/pasteDest
それ以外の場合は(*[^0-9]|)
foo120とも一致します。
ksh
or(またはinside)または(within)を使用すると、そのbash -O extglob
項目(ファイルがコピーされる順序を除く)は次のようになります。shopt -s extglob
bash
zsh -o kshglob
set -o kshglob
zsh
(
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つのモードを設けることにより交番が行われる。