次のコマンドを試しましたが、結果がわかりません。
ls **
どういう**
意味ですか?どのように使用すればよいですか?
ベストアンサー1
おそらく、*
ディレクトリ内でのみ一致するワイルドカードである単一の とは対照的に、ワイルドカード ファイル名パターンをディレクトリ境界を越えて一致させることができる、一部のシェルの特別な機能をご覧になっていることでしょう。
このようなシェルがない場合、**
は と同等になる可能性があります*
。これは、「0 個以上の文字の後に 0 個以上の文字が続く」ことは、単に「0 個以上の文字に一致する」ことと同じであるためです。
しかし、もしそのようなシェルを持っているなら、 **
現在のディレクトリ内のすべてのファイルとディレクトリに一致しますおよびサブディレクトリは、*
現在のディレクトリ内のファイルとディレクトリのみに一致します。(どちらの場合も、 で始まる名前の「ドット ファイル」は.
一致しません)。
**
の本当の力は、より具体的なパターンで使用したときに発揮されます。たとえば、 を使用.txt
すると、サブディレクトリに関係なくすべてのファイルを指定できます**/*.txt
が、 は*.txt
現在のディレクトリにあるファイルのみに一致します。
シェルが何をしているかを確実に知るには、シェルのワイルドカードマッチングルールを確認する必要があります。たとえば、bash
マニュアル言う:
*
ヌル文字列を含む任意の文字列に一致します。'globstar' シェル オプションが有効で、ファイル名拡張コンテキストで '*' が使用されている場合、単一のパターンとして使用される 2 つの隣接する '*' は、すべてのファイルと 0 個以上のディレクトリおよびサブディレクトリに一致します。'/' が続く場合、2 つの隣接する '*' は、ディレクトリとサブディレクトリにのみ一致します。
最近のバージョンのbash
'globstar' シェル オプションはデフォルトで無効になっています。有効にするには、次の操作を行います。
shopt -s globstar
zsh もこの構文をサポートしていると思います。
ワイルドカードはコマンドではなくシェルによって展開されることを覚えておくことが重要ですls
。ls **
、 または と入力した場合ls *.txt
、ls
コマンド自体は文字を認識しません*
。コマンド ラインにリスト全体を入力した場合と同じように、パターンに一致するファイルの展開されたリストのみを認識します。