コマンドls
を使用すると、すべてのディレクトリが一覧表示されます。しかし、ls *
コマンドdo?私はそれを使用し、それは単にディレクトリをリストします。 ls
の前の星は、ディレクトリがリストされる深さを意味しますか?
コマンドls
のデフォルトはls .
です:現在のディレクトリ内のすべてのエントリをリストします。
コマンドls *
は、「*
シェルパターンの展開時にlsを実行する」ことを意味します
*
パターンはシェルによって処理され、.
で始まるものを除いて、現在のディレクトリ内のすべてのエントリに展開されます。それは1レベル深くなります。
ダブルまたはトリプルの*
パターンの解釈は、使用される実際のシェルによって異なります。
*
は、0文字以上に一致するワイルドカードです。最近のシェルの中には、**
パターンを見るとサブディレクトリに再帰するものがあります。
最初にecho
の代わりにls
と入力して、コマンド全体がどのように展開されるかを確認することで、プロセス全体をわかりやすく説明できます。
$ echo *
Applications Downloads Documents tmp.html
したがって、この場合、ls *
はls Applications Downloads Documents tmp.html
に展開されます
$ echo **
Applications Downloads Documents tmp.html
$ echo ***
Applications Downloads Documents tmp.html
変化はありません。これは、シェルとしてbash
を使用していることを前提としています。ほとんどの人はそうであり、シェルによって動作が異なります。 ash
またはcsh
またはksh
またはzsh
を使用している場合は、動作が異なる場合があります。それが異なるシェルを持つことのポイントです。
では、別の方法を試してみましょう(まだbash
を使用)。グロビング(*
)演算子が私たちにできることのアイデアを得ます。たとえば、名前の一部でフィルタリングできます。
$ echo D*
Downloads Documents
そして興味深いことに、末尾のスラッシュは暗黙的にディレクトリ名の一部です。したがって、*/
はディレクトリ(およびディレクトリへのシンボリックリンク)のみを生成します。
$ echo */
Applications/ Downloads/ Documents/
そして、途中にスラッシュを置くことにより、複数のレベルでいくつかのフィルタリングを行うことができます:
$ echo D*/*/
Documents/Work/ /Documents/unfinished/
Downloads
ディレクトリにはサブディレクトリが含まれていないため、出力には含まれません。これは、必要なファイルを調べるだけの場合に非常に役立ちます。私はいつもこのようなコマンドを使用しています:
$ ls -l /home/*/public_html/wp-config.php
これは、ユーザーのwp-config.php
ディレクトリのベースレベルに存在するすべてのpublic_html
ファイルがある場合、それをリストします。または、おそらくより完全にするために:
$ find /home/*/public_html/ -name wp-config.php
これにより、任意のユーザーのwp-config.php
ディレクトリまたはそのサブディレクトリにあるpublic_html
ファイルが見つかりますが、何も検査しないため、find /home/ -name wp-config.php
よりも効率的に動作しますbut各ユーザーのpublic_html
ディレクトリ。
globstar
オプションを有効にしたbash 4.xを含む一部のシェルでは、**
は、一致するディレクトリを降順に再帰グロブを実行します。アスタリスクを追加しても、この操作は変更されません。
「深く掘り下げたい」場合は、ls -R(再帰)オプションを使用するか、次のようにfindを使用します。
find . -ls
「検索」は、ディレクトリツリーの最下部まで(「ls -R」と同様に)表示され、ディレクトリの一覧表示(-type d)、ファイルのみ(-type f)、その他のファイルの表示など、さらに多くのオプションがあります。特性(/ etc/passwdにユーザーがいない、特定のアクセス許可、その他すべて) "find"は、スクリプトで多少安全でもあります(シェル間での一貫性のないグロビングルール、およびダッシュを含むファイルの特別なエスケープなど)。
シェルワイルドカードグロビングは、ドットファイルのアスタリスク「*」だけでは機能しません。ドットファイルのみを一覧表示するには、次を使用します。
ls .??*