20から32までの番号が含まれているファイルをcopyDestからpastDestにコピーしたいのですが、何が間違っていますか?
cp -r ~/copyDest/*2[0-9]|3[0-2]* ~/pasteDest
ありがとう。
_|
_はパイプライン演算子です。
_cp -r ~/copyDest/*2[0-9]|3[0-2]* ~/pasteDest
_
_3[0-2]*
_グロブから展開された最初のファイルを名前とするコマンドにパイプされるcp
コマンドです。 _|
_がグロブ代替演算子であるためには、zsh
内の_(...)
_内にあります(ただし、zsh
は数値範囲マッチング専用の演算子を持っています)および@(...)
in ksh
(またはbash
with extglob
on)。
したがって、zsh
の場合:
_cp -r ~/copyDest/(*[^0-9]|)<20-32>(|[^0-9]*) ~/pasteDest
_
_(*[^0-9]|)
_がない場合、foo120にも一致します
ksh
または_bash -O extglob
_(またはbash
内で_shopt -s extglob
_を使用)または_zsh -o kshglob
_(zsh
内で__set -o kshglob
_)を使用して、同等のもの(ファイルがコピーされる順序を除く)は次のようになります。
_(
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
_(グロブ展開のソート順にも影響します)。ファイル名にASCII文字のみが含まれている場合は、適切なシステムのロケールがASCII以外の文字を含むとは思わないため、省略できます0123456789は_[0-9]
_に一致します。他の方法は、_[0-9]
_を_[0123456789]
_で置き換えることです。
また、_zsh -o kshglob
_を除いて、パターンがどのファイルとも一致しない場合、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
_およびco:
_cp -r ~/copyDest/*@(2[0123456789]|3[012])* ~/pasteDest
_
シェルパターンマッチングのマニュアルを読み損ねて、一般に「正規表現」と呼ばれるものと同じであると想定しました。ただ*
演算子は、例で使用していますが、意味が異なるため、同じではないというヒントになるはずです。
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
Shellオプションを設定して、それを回避できます。
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 ~]$
番号付きファイルを処理する必要がある場合は、forループとseq
を使用する傾向があります。
for i in $(seq 20 32); do cp -r ~/copyDest/*${i}* ~/pasteDest; done
Yoeは、正規表現マッチングではなく、パターンマッチングを行う必要があります。シェルのmanページを調べてください。のようなものを試してください
ls *2[0-9]* *3[0-2]*
つまり、2つのパターンを指定することにより、代替を実装します。