web-dev-qa-db-ja.com

ls *、ls **お​​よびls ***の結果

コマンドlsを使用すると、すべてのディレクトリが一覧表示されます。しかし、ls *コマンドdo?私はそれを使用し、それは単にディレクトリをリストします。 lsの前の星は、ディレクトリがリストされる深さを意味しますか?

86
Andy M

コマンドlsのデフォルトはls .です:現在のディレクトリ内のすべてのエントリをリストします

コマンドls *は、「*シェルパターンの展開時にlsを実行する」ことを意味します

*パターンはシェルによって処理され、.で始まるものを除いて、現在のディレクトリ内のすべてのエントリに展開されます。それは1レベル深くなります。

ダブルまたはトリプルの*パターンの解釈は、使用される実際のシェルによって異なります。

*は、0文字以上に一致するワイルドカードです。最近のシェルの中には、**パターンを見るとサブディレクトリに再帰するものがあります。

36

最初に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ディレクトリ。

12
tylerl

globstarオプションを有効にしたbash 4.xを含む一部のシェルでは、**は、一致するディレクトリを降順に再帰グロブを実行します。アスタリスクを追加しても、この操作は変更されません。

「深く掘り下げたい」場合は、ls -R(再帰)オプションを使用するか、次のようにfindを使用します。

find . -ls

「検索」は、ディレクトリツリーの最下部まで(「ls -R」と同様に)表示され、ディレクトリの一覧表示(-type d)、ファイルのみ(-type f)、その他のファイルの表示など、さらに多くのオプションがあります。特性(/ etc/passwdにユーザーがいない、特定のアクセス許可、その他すべて) "find"は、スクリプトで多少安全でもあります(シェル間での一貫性のないグロビングルール、およびダッシュを含むファイルの特別なエスケープなど)。

シェルワイルドカードグロビングは、ドットファイルのアスタリスク「*」だけでは機能しません。ドットファイルのみを一覧表示するには、次を使用します。

ls .??*

0
Razzlephrazz