「ls .*」が隠されたディレクトリの内容を表示するのはなぜですか?

「ls .*」が隠されたディレクトリの内容を表示するのはなぜですか?

ls .*隠しディレクトリの内容が印刷されるのはなぜですか?隠しファイルを印刷したいのですが、今はわかります。 隠しファイルのみを表示解決策ですが、ディレクトリの内容が表示される理由をまだ知りたいです。追加の入れ子になったディレクトリの内容は表示されません。

ls .*以下は私のホームディレクトリのいくつかの出力です。

.bash_history
.bash_profile
.bashrc
.coin_history
.emacs
.gitconfig
.gitignore_global
.grasp_jss

.ssh:
config          github_rsa.pub  id_rsa.pub      known_hosts.old
github_rsa      id_rsa          known_hosts     lambda.pem

.vim:
colors   ftdetect syntax

このマシンはRHELを実行しています。 Mac OSXでも同様の動作が観察されます。

答え1

短い答え:シェル全体の拡張。

シェルは入力を受け取り、その.*部分を渡す前に拡張するので、ls基本的には次のようになります。

$ ls .bash_history .bash_profile .bashrc .coin_history .emacs ...

したがって、各項目がリストされます。ディレクトリエントリを表示すると、期待どおりにそのディレクトリの内容が一覧表示されますls。作業ディレクトリのファイル/ディレクトリのみを表示するには、-d次のオプションを使用しますls

$ ls -d .*

この-dオプションは、ls「コンテンツではないディレクトリ自体を一覧表示します」(lsマンページから取得)を指示します。

答え2

ls .*隠しディレクトリの内容が印刷されるのはなぜですか?

lsディレクトリが与えられたら、そのディレクトリの内容を印刷します(デフォルトではそのディレクトリの隠しファイルを除く)。によってls .*シェルは、ls次から始まるファイルとディレクトリのリストを提供します。.

を使用すると、set -xシェルから呼び出されたコマンドを表示できます(つまり、シェルglobが展開された後)。

答え3

するとき

$ ls directory

あなたが得るリストですdirectory。ディレクトリの場合はdirectoryその内容がリストされ、それ以外の場合は他のファイルのようにリストされます。

するとき

$ ls dir*

一致するすべてのコンテンツのリストが表示されますdir*。これらのいずれかがディレクトリの場合は、そのディレクトリの内容が表示されます。

するとき

$ ls .*

パターンだけが異なるだけで、前の例と同じ効果が得られ、隠されたファイルとフォルダが明示的に一致するため、これら(一致するファイルとフォルダ)が考慮されますls

フォルダの内容(隠されているかどうか)を見たくない場合は、lsそのフラグを使用してください。指定したパターンに一致する見つかったフォルダへの繰り返しが停止-dします。ls

答え4

具体的に教えてくださったからです。 Shell globの拡張部分が明らかであれば、本当に必要な答えは質問の後に隠れた混乱を考慮した答えだと思います。

あなたはlsが提供するものとlsが提供するものを混同しています。 lsは隠しディレクトリ/ファイルを提供しませんが、隠されたディレクトリ/ファイルのリストを提供できます。.*排他的に使用します(強調し.ない*)。

関連情報