ls -dがファイルを一覧表示するのはなぜですか、どこに記録されますか?

ls -dがファイルを一覧表示するのはなぜですか、どこに記録されますか?
  • 指定した場合、ls --directory a*次から始まるディレクトリのみa*
  • ただし、次に始まるファイルとディレクトリが一覧表示されます。a

質問:

  • man私が徹底的に見た文書に加えて、この問題に関する文書をどこで見つけることができますかinfo
  • これはBASHにのみ適用されますか?

答え1

a*構文はコマンド*a*ではなくシェルによって実装されています。ls

入力したとおり

ls a*

シェルプロンプトでは、シェルはa*現在のディレクトリの名前に展開されますa。たとえば、a*シーケンスに展開してa1 a2 a3引数として渡すことができますls。コマンド自体は役割をls見ることができず、そして3つのパラメータしか見ることができません。*a1a2a3

ワイルドカード拡張の場合、「ファイル」は現在のディレクトリのすべてのエンティティを表します。たとえば、a1通常のファイル、a2ディレクトリ、またはa3シンボリックリンクなどです。これらはすべてディレクトリエントリを持ち、シェルのワイルドカード拡張は、そのエントリが参照するエンティティタイプが何であるかは関係ありません。

実際に触れることができるすべてのシェル(bash、sh、ksh、zsh、csh、tcsh...)はワイルドカードを実装します。詳細は異なる場合がありますが、*ゼロ個以上の文字と?単一文字を一致させる基本構文はかなり一貫しています。

特にbashの場合は、bashマニュアルの「ファイル名拡張」のセクションで説明されており、info bash「ファイル名拡張」を実行して検索または確認してください。ここ

これが単一のコマンドではなくシェルによって実行されるという事実は、いくつかの興味深い(時には驚くべき)結果をもたらします。最良の点はワイルドカード処理が(ほぼ)みんなコマンド;シェルがこれを行わない場合、必然的に一部のコマンドは問題になりませんが、他のコマンドは、作成者が「より良い」と見なす微妙に異なる方法で実行されます。 (私の考えでは、Windowsコマンドシェルにこの問題があるようですが、これ以上説明するのに慣れていません。)

一方、複数のファイルの名前を変更するコマンドを作成することは困難です。あなたが書いている場合:

mv *.log *.log.bak

*.log.bak現在のディレクトリにすでに存在するファイルに基づいて拡張されているため、失敗する可能性があります。これらの操作を実行できるコマンドがありますが、ファイルの名前を変更する方法を指定するには、一意の構文を使用する必要があります。一部のコマンド(例find:)は独自のワイルドカード拡張を実行できます。シェル拡張を抑制するには、引数を引用する必要があります。

find . -name '*.txt' -print

シェルのワイルドカード拡張は、完全にコマンドライン引数の構文と既存のファイルセットに基づいています。それできないコマンドの意味に影響されます。たとえば、.logすべてのファイルを親ディレクトリに移動するには、次のように入力します。

mv *.log ..

忘れた場合..

mv *.log

.log現在のディレクトリには正確に2つのファイルがあり、次のように展開されます。

mv one.log two.log

これにより名前が変更され、one.log中断されますtwo.log

編集する:賛成52個、受け入れ1個、マスターバッジを受け取った後、実際にタイトルの質問に答えなければならないようです。

-dまたは、オプションはディレクトリのみをリストするように指示--directoryしません。lsディレクトリの内容ではなく、ディレクトリのようにディレクトリを一覧表示するように指示します。ディレクトリ名をパラメータとして指定すると、デフォルトでlsディレクトリ名が一覧表示されます。コンテンツ一般的に興味のあるディレクトリ名です。この-dオプションは、ディレクトリ自体のみをリストするように指示します。これはワイルドカードと組み合わせるときに特に便利です。次のように入力する場合:

ls -l a*

lsそれぞれの長いリストを与える文書aで始まる名前、コンテンツで始まるすべてのディレクトリa。ファイルとディレクトリのリスト(各行)が必要な場合は、次のものを使用できます。

ls -ld a*

これは次のとおりです。

ls -l -d a*

繰り返しますが、lsこの文字はこのコマンドでは表示されません*

文書化された場所については、ほとんどすべてのUnixシリーズシステムでman lsこのコマンドの文書が表示されます。lsほとんどのLinuxベースのシステムでは、このlsコマンドはGNU coreutilsパッケージの一部です。infoコマンドがある場合は、より明確で包括的な文書を提供またはinfo ls提供する必要があります。info coreutils lsMacOSなどの他のシステムでは、これらのシステムに対して異なるバージョンのコマンドを使用することも、使用しlsないこともあります。infoman lsls --help比較的ショートユースメッセージ(私のシステムでは117行)もし私はGNU coreutils実装を使用しています。

はい、専門家は時々文書を参照する必要があります。また、見ることができますこの古典的なジョーク

答え2

Keith Thompsonの回答を参照して、ファイルがls --directory a*表示される理由を説明してください。そしてディレクトリ:この--directoryオプションは、ディレクトリ以外のファイルを抑制しません。代わりにディレクトリをそのままリストします。それ以外の場合は、その内容が一覧表示されます。例:

$ mkdir foo
$ touch foo/bar
$ ls foo
bar
$ ls --directory foo
foo

答え3

非常に明確にするために、次の文書に文書化されています。ls(1) マニュアルページ:

-d、--ディレクトリ コンテンツの代わりにディレクトリエントリを一覧表示し、シンボリックリンクを逆参照しません。

公平に言うと、「内容ではなくアイテム」がより説明的である可能性があります。

FILEがディレクトリの場合、ディレクトリの内容を一覧表示するのではなく、ディレクトリエントリ自体が表示されます。 FILEがシンボリックリンクの場合、リンクが指すファイルではなくリンクエントリ自体が表示されます。

答え4

文書にはリストがありません。ただディレクトリエントリの代わりにlsディレクトリ名を受け取ると、ディレクトリエントリがリストされます。変えるこれが内容です。理解する最良の方法は例を通してです。

> {ice} ~ :10:47 % ls -l / 
total 97
drwxr-xr-x   2 root root  4096 May  3 00:27 bin
drwxr-xr-x   4 root root  1024 May  3 14:17 boot
drwxr-xr-x   2 root root  4096 Apr 29 13:44 cdrom
drwxr-xr-x  18 root root  4420 May  9 09:58 dev
...
lrwxrwxrwx   1 root root    33 May  3 14:16 vmlinuz -> boot/vmlinuz-3.9.0-030900-generic
lrwxrwxrwx   1 root root    29 May  3 11:07 vmlinuz.old -> boot/vmlinuz-3.8.0-19-generic
> {ice} ~ :10:47 % ls -ld /
drwxr-xr-x 25 root root 4096 May  3 14:16 /

関連情報