回答:
グローブは正規表現ではありません。一般に、シェルは、コマンドラインで入力したものを、グロブとして引用しないものはすべて解釈しようとします。シェルは正規表現をまったくサポートする必要はありません(実際には、より現代的なものの多くは、たとえば、構造内の=~
正規表現一致演算子をサポートしていますbash
[[
)。
これ.??*
はグロブです。これは、リテラルドット.
で始まり、任意の2つの(必ずしも同じではない)文字??
が続き、に相当する正規表現が続く[^/]*
、つまり0ではない文字が続く任意のファイル名に一致します/
。
シェルのパス名展開の完全な詳細(「グロビング」の完全な名前)については、POSIX仕様を参照してください。
.
..
.X
.
..
tar zcvf dotfiles.tar.gz .[!.] .??*
ls .?
は同じを返しました。ls ..
つまり、パターンに一致するフォルダーに他のエントリーがなかったことを意味しました.?
。以外の.[^.]
すべての.?
ファイルに対して行ったはずです..
。
[^abc]
は、正規表現構文は[!abc]
glob構文と同じです(つまり、globに^
置き換えられます!
)。[^abc]
グロブでスタイル構文を使用することは、POSIXがその意味を指定しないため、あまり移植性がありません。したがって、一部のシェルは正規表現のようなセマンティクスを使用して解釈し^
ます。
.[!.]
に、tar
コマンドラインにリテラルとして残される可能性があることに気付いたのです。一部のシェルでは、たとえばbashを使用して、その動作を制御できます。shopt -s nullglob
何も一致しない場合、コマンドラインから消えますが、これは普遍的な機能ではありません。
.??*
ワイルドカード(ない正規表現、それはそのように見えますが)期間(で始まるファイル名に変換.
2つの文字(続く)、??
続い)、および他の任意の数の文字(ゼロ以上)( *
)。
おそらく、ファイル名のワイルドカードに関するこのページが役立つでしょう。
他の回答に追加するために、1つ?
は1文字のファイル名に変換され、??
2文字のみのファイル名などに一致します。
[root@mercy testdir_2]# ls
ion it r
[root@mercy testdir_2]# ls ?
r
[root@mercy testdir_2]# ls ??
it
[root@mercy 1 testdir_2]# ls ???
ion
[root@mercy testdir_2]#