
私は初心者で、ターミナルコマンドを学ぼうとしています。今日、cpワイルドカードコマンドオプションで問題が発生しました。ターミナルで次のコマンドを入力しました。
cp Downloads/[:alnum:] test/
ここでは、Downloads
英数字ファイルを自分のtest
ディレクトリにコピーするディレクトリを示します。ただし、このコマンドを実行すると、次の内容が表示されました:
cannot stat ‘Downloads/[:alnum:]’: No such file or directory
上記のワイルドカード クラスをコマンドに使用する方法を知りたいですcp
。また、上記のワイルドカード文字コマンドを使用する方法も知りたいです。
ワイルドカードは
*
?
[characters]
[!characters]
[[:classes:]]
よく使われるクラスは
[:alnum:]-> Match any Alphanumeric Character
[:alpha:] -> Match any Alphabetic Character
[:digit:] -> Match any nummeral
[:lower:] -> Matches any lowercase letter
[:upper:] -> Matches any Uppercase letter
これらのワイルドカードとそのクラスをどのように使用すればよいでしょうか?
答え1
cp
bash
は、それ自体ではワイルドカードをサポートしていません。ワイルドカードとパターンの展開は、デフォルトでシェルによって実行されます。
いずれの場合も、文字クラスは 内で指定する必要があります[]
。つまり、[]
すでに囲まれている文字クラスは除外されます。次のようになります。
cp Downloads/[[:alnum:]] test/
ただし、[[:alnum:]]
一致するのは 1 つの英数字のみです。英数字のみを含むすべてのファイル名に一致させるには、すでにリストされているワイルドカードだけでは不十分です。より強力なフィルタリングを行うには、次のfind
コマンドを調べてください。
find . -regextype posix-extended -maxdepth 1 -regex '.*/[[:alnum:]]*'
内ではbash
、拡張グロブ:
shopt -s extglob
cp Downloads/*([[:alnum:]]) test/
答え2
[:alnum:]
実際には1文字に一致するセットから :
、、、、、a
すなわちl
、与えられn
たu
m
$ ls
_?_ 123 7 a abc :file fi:le m
それから
$ ls [:alnum:]
a m
英数字の1文字に一致するクラス [:alnum:]
それは必要だ[[:alnum:]]
$ ls [[:alnum:]]
7 a m
1つの英数字とそれに続く0個以上の任意の文字に一致します
$ ls [[:alnum:]]*
123 7 a abc fi:le m
ファイルを一致させるにはのみシェルグロビングを使用した英数字の文字の拡張グロブ( extglob
) 構文
$ ls +([[:alnum:]])
123 7 a abc m