シェルコマンドで..?*はどういう意味ですか?


22

のコマンドは、意志tar、すべての「ドット」ファイルとフォルダ:

tar -zcvf dotfiles.tar.gz .??*

私は正規表現に精通していますが、解釈方法がわかりません.??*。私は実行ls .??*tree .??*、リストされたファイルを見ました。この正規表現に.、たとえばで始まるフォルダー内のすべてのファイルが含まれるのはなぜですか?


回答:


32

グローブは正規表現ではありません。一般に、シェルは、コマンドラインで入力したものを、グロブとして引用しないものはすべて解釈しようとします。シェルは正規表現をまったくサポートする必要はありません(実際には、より現代的なものの多くは、たとえば、構造内の=~正規表現一致演算子をサポートしていますbash [[)。

これ.??*はグロブです。これは、リテラルドット.で始まり、任意の2つの(必ずしも同じではない)文字??が続き、に相当する正規表現が続く[^/]*、つまり0ではない文字が続く任意のファイル名に一致します/

シェルのパス名展開の完全な詳細(「グロビング」の完全な名前)については、POSIX仕様を参照してください。


10
追加のポイント:これは、特別なエントリとを除いて、ディレクトリ内のすべてのドットファイルに一致するグロブを書き込もうとする試みです。それはまったく正しくありません。Xがドット以外の文字である場合、「」という名前のものは選択しません。私はそれが一致する単一のグロブ書くことは可能だとは思わない、すべてを除いドットファイルをして、しかし、あなたは2でそれを行うことができます。例えば。....X...tar zcvf dotfiles.tar.gz .[!.] .??*
zwol

@Zack:説明をありがとう。それについてのコメントを投稿しましたが、その後削除しました。ls .?は同じを返しました。ls ..つまり、パターンに一致するフォルダーに他のエントリーがなかったことを意味しました.?。以外の.[^.]すべての.?ファイルに対して行ったはずです..
-SabreWolfy

2
@SabreWolfy POSIX仕様を注意深く読んだ場合、それは実際にはglobと正規表現の重要な違いです。ブラケット式で[^abc]は、正規表現構文は[!abc]glob構文と同じです(つまり、globに^置き換えられます!)。[^abc]グロブでスタイル構文を使用することは、POSIXがその意味を指定しないため、あまり移植性がありません。したがって、一部のシェルは正規表現のようなセマンティクスを使用して解釈し^ます。
jw013

1
@ jw013:詳細をありがとう。glob!= regexp :)
SabreWolfy

1
そのパターンに一致するファイルが存在しない一般的な場合.[!.]に、tarコマンドラインにリテラルとして残される可能性があることに気付いたのです。一部のシェルでは、たとえばbashを使用して、その動作を制御できます。shopt -s nullglob何も一致しない場合、コマンドラインから消えますが、これは普遍的な機能ではありません。
-zwol

8

.??*ワイルドカード(ない正規表現、それはそのように見えますが)期間(で始まるファイル名に変換.2つの文字(続く)、??続い)、および他の任意の数の文字(ゼロ以上)( *)。

おそらく、ファイル名のワイルドカードに関するこのページが役立つでしょう。


-1

他の回答に追加するために、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]#

Downvoter、コメントしてください。私が間違っている場合は、修正して喜んでいるでしょう。
スリー

あなたの答えは質問に完全に答えていませんでした。
-SabreWolfy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.