
ls -d がどのように機能するのか理解できません。他の ls -d の質問を読みましたが、 がls -d *
と同じように機能しない理由を尋ねる質問はありませんls -d */
でした。末尾の区切り文字がなぜそれほど重要なのでしょうか?
ls *
ls */
同じように動作するので、同じように動作することをls -d *
期待していました。ls -d */
代わりに、
ls -d *
は と同様に現在のディレクトリ内のすべてのファイルを一覧表示しますls
が、 はls -d */
現在のディレクトリ内のディレクトリを一覧表示します。なぜそうなるのでしょうか?
答え1
ls *
そしてls */
同じように行動します。
いいえ、そうではありません。作業ディレクトリにファイルがある場合、最初のコマンドではリストされますが、2 番目のコマンドではリストされません。
ls
コマンドラインで渡されたファイルとディレクトリ(その内容を含む)をリストします。シェルグロブを使用する場合、シェルはパターン「アルファベット順に並べられたファイル名のリスト」(cfファイル名の拡張)。
パターンは、*
現在のディレクトリ内のすべてのファイルとディレクトリに一致します ( で始まる隠しファイルは除く.
)。一方、*/
はディレクトリにのみ一致します (隠しディレクトリは除く)。
このスイッチは-d
ディレクトリの内容の一覧表示を無効にしますが、ls に渡されたファイルは引き続き一覧表示されます。
答え2
答えは、末尾に/
ls がディレクトリのみを参照するように強制するということです。
動作は一貫していることに注意してください ( の有無にかかわらず-d
)。
ちょっとしたテスト:
mkdir /tmp/test
touch /tmp/test/a
mkdir /tmp/test/b
touch /tmp/test/b/c
cd /tmp/test
そして、実行すればls *
違いls */
に気づくでしょう。