119

次のコマンドを試しましたが、結果の解釈に問題があります。

ls **

それが何を出力しているのか、そしてその理由は正確にはわかりません。

4

4 に答える 4

202

*ディレクトリ内でのみ一致するワイルドカードである単一の .

そのようなシェルを持っていない場合、**はおそらく と同等です。これは*、「0 個以上の文字に続いて 0 個以上の文字に一致する」ことは、単に「0 個以上の文字に一致する」ことと同じであるためです。

ただし、そのようなシェルがある場合、 は現在のディレクトリとサブディレクトリ**内のすべてのファイルとディレクトリにディレクトリのみに一致します。(どちらの場合も、"ドット ファイル"、名前が , で始まるファイルは一致しません)。*.

**の本当の力は、より具体的なパターンで使用するときに発揮されます。たとえば、.txtサブディレクトリに関係なくすべてのファイルを指定できますが、現在のディレクトリ内の**/*.txtファイル*.txtのみに一致します。

シェルのワイルドカード マッチング ルールを調べて、シェルが何を行っているかを確認する必要があります。たとえば、bashマニュアルには次のように書かれています。

*
null 文字列を含む任意の文字列に一致します。'globstar' シェル オプションが有効で、'*' がファイル名展開コンテキストで使用されている場合、1 つのパターンとして使用される 2 つの隣接する '*' は、すべてのファイルと 0 個以上のディレクトリおよびサブディレクトリに一致します。'/' が続く場合、隣接する 2 つの '*' はディレクトリとサブディレクトリのみに一致します。

bash'globstar' シェル オプションの最近のバージョンでは、デフォルトで無効になっています。有効化:

shopt -s globstar

zsh もこの構文をサポートしていると思います。

ワイルドカードは、コマンドではなくシェルによって展開されることに注意してlsください。ls **、またはを入力ls *.txtすると、lsコマンド自体は*文字を認識しません。コマンドラインでリスト全体を入力したかのように、パターンに一致するファイルの展開されたリストのみが表示されます。

于 2015-01-28T18:24:10.833 に答える
96

グロビング

二重アスタリスク ( **) を使用すると、globを使用してファイルシステム上のファイルを一覧表示できます。グロブは、ファイル パスの照合に使用されるリテラルまたはワイルドカード文字の文字列です。ファイルシステム上のファイルを見つけるために 1 つ以上のグロブを使用することを、グロビングと呼びます

Linux シェルとは別に、グロビングはさまざまな構成ファイルでも使用され、検索するファイルのリストを指定します。例: ファイル内で無視するファイルとフォルダー、Typescript プロジェクト内のファイル内.gitignorefilesオプションincludeなど。tsconfig.json

以下は、グロビングの最も重要な側面の一部であり、二重アスタリスク ( **) はその 1 つです。


セグメントとセパレータ ( /)

セパレータは常に/文字です。セグメントは、2 つのセパレーターの間にあるすべてのものです。

例:Tests/HelloWorld.js

ここで、TestsHelloWorld.jsはセグメントで、/はセパレータです。


シングル アスタリスク ( *)

単一のアスタリスク ( ) は、 1 つのセグメント*内の 0 個以上の文字に一致します。1 つのディレクトリ内のファイルをグロビングするために使用されます。

例:*.js

このグロブは のようなファイルに一致しますが、 のようなファイルには一致しHelloWorld.jsませんTests/HelloWorld.jsTests/UI/HelloWorld.js


二重アスタリスク ( **)

二重アスタリスク ( ) は、複数のセグメント**にわたる 0 個以上の文字に一致します。ネストされたディレクトリにあるファイルをグロビングするために使用されます。

例:Tests/**/*.js

ここでは、ファイルの選択はディレクトリに制限されますTests。グロブは、、、などのファイルに一致Tests/HelloWorld.jsTests/UI/HelloWorld.jsますTests/UI/Feature1/HelloWorld.js


クエスチョンマーク( ?)

疑問符 ( ?) は、1 つのセグメント内の 1 つの文字に一致します。一部のファイルまたはディレクトリの名前が 1 文字だけ異なる場合は、?.

例:tests/?at.js

tests/cat.jsこれは、、などのファイルtest/Cat.jsに一致します。test/bat.js


角括弧 ( [abc])

角括弧 ( [...]) は、角括弧で囲まれた単一の文字でファイルをグロブします。

例:tests/[CB]at.js

このグロブは、tests/Cat.jsまたはのようなファイルに一致しますtests/Bat.js


角括弧の範囲 ( [a-z])

角括弧範囲 ( [a-z]) は、範囲内で指定された 1 文字に一致します。

例:tests/feature[1-9]/HelloWorld.js

このグロブはtests/feature1/HelloWorld.js、 などのファイルに一致test/feature2/HelloWorld.jsします... 9.


否定 ( !)

一部のファイルを除外するには、否定 (!) を使用できます。

例 1:tests/[!C]at.js

これにより、ファイルが除外され、、、、などのファイルと一致tests/Cat.jsします。tests/Bat.jstests/bat.jstests/cat.js

否定は、一部のファイルを否定または除外するために、配列内の構成ファイルでも使用されます。

例 2:['Tests/**/*.js', '!Tests/UI/**']

これにより、ディレクトリからすべてのファイルとフォルダーが除外されますTests/UI


それでおしまい!それが役立つことを願っています!

于 2020-07-19T20:51:31.767 に答える