
たとえば、inはrm -r abc*
"*"
すべての文字列を意味します。ただし、touch abc* abcd* abcde*
これをinで使用すると(そしてabc、abcd、またはabcdeで始まるディレクトリにファイルがない場合)、"*"
これはシンボルのみを意味し、abc* abcd* abcde*
ファイルが生成されます。後でファイルを使用すると、touch -m ab*
変更時間がabc* abcd* abcde*
変更されます。
場合によっては文字列を意味し、"*"
他の場合は記号のみを意味するのはなぜですか?コンピュータはいつ意味を変えなければならないかをどうやって知ることができますか?
答え1
引用符のないパターンがシェルで使用される場合、abc*
シェルはそれを使用可能なファイル名と一致させようとします(これは「ファイル名の生成」と呼ばれますが、しばしば「グロービング」とも呼ばれます)。ファイル名と一致できない場合、ほとんどのsh
類似シェルはパターンを拡張せずにそのままユーティリティに渡します。
例:
$ touch xyz
$ touch abc*
$ tree
.
|-- abc*
`-- xyz
0 directory, 2 files
$ touch xyz*
$ tree
.
|-- abc*
`-- xyz
0 directory, 2 files
このtouch xyz*
コマンドが実行されました。いいえファイル名がパターンと一致するxyz*
ため、名前付きファイルを作成します。したがって、ユーティリティは対応するファイル名で呼び出されます。xyz
touch
xyz
シェルでシェルオプションをbash
設定すると、シェルグロブが何も一致しない場合、シェルは文句を言います。failglob
shopt -s failglob
$ shopt -s failglob
$ touch 123*
bash: no match: 123*
デフォルトでは、そのオプションはzsh
シェルでオンになっています。
nullglob
bash
(or)でNULL_GLOB
シェルオプションを設定すると、zsh
ファイル名と一致しないとパターンが消えます。
$ shopt -s nullglob
$ touch fo*
usage: touch [-acm] [-d ccyy-mm-ddTHH:MM:SS[.frac][Z]] [-r file]
[-t [[cc]yy]mmddHHMM[.SS]] file ...
touch
(パラメータなしで呼び出されたためエラーが発生します)
パターンが(現状のまま)文字列として使用されていることを確認し、いいえワイルドカードの場合は、これを引用する必要があります。
$ touch "file*"
$ touch "file**"
$ touch "file***"
$ tree
.
|-- file*
|-- file**
`-- file***
0 directory, 3 files
この例では、ファイル名を引用しない場合とパターンが名前と一致するため、名前付きファイルのみが提供されますfile*
(ディレクトリが最初に空の場合)。file**
file***
file*