web-dev-qa-db-ja.com

名前に20から32までの番号が含まれているファイルをコピーする方法

20から32までの番号が含まれているファイルをcopyDestからpastDestにコピーしたいのですが、何が間違っていますか?

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

ありがとう。

4
user317427

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

_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
    _
8

シェルパターンマッチングのマニュアルを読み損ねて、一般に「正規表現」と呼ばれるものと同じであると想定しました。ただ*演算子は、例で使用していますが、意味が異なるため、同じではないというヒントになるはずです。

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オプションを設定して、それを回避できます。

6
RalfFriedl

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 ~]$
6
steve

番号付きファイルを処理する必要がある場合は、forループとseqを使用する傾向があります。

for i in $(seq 20 32); do cp -r ~/copyDest/*${i}* ~/pasteDest; done
3
Zoltan

Yoeは、正規表現マッチングではなく、パターンマッチングを行う必要があります。シェルのmanページを調べてください。のようなものを試してください

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

つまり、2つのパターンを指定することにより、代替を実装します。

1
RudiC