ls --directory a*
を指定する場合、a*
で始まるディレクトリのみをリストする必要がありますa
で始まるファイルとディレクトリをリストします質問:
man
とinfo
以外に、これに関するドキュメントはどこにありますか?a*
および*a*
構文は、ls
コマンドではなく、シェルによって実装されます。
入力すると
ls a*
シェルプロンプトでは、シェルはa*
を、現在のディレクトリ内でa
で始まる既存のすべてのファイルのリストに展開します。たとえば、a*
をシーケンスa1 a2 a3
に展開し、それらをls
に引数として渡すことができます。 ls
コマンド自体は*
文字を認識しません。 3つの引数a1
、a2
、およびa3
のみを認識します。
ワイルドカード拡張の目的で、「ファイル」は現在のディレクトリ内のすべてのエンティティを指します。たとえば、a1
は通常のファイル、a2
はディレクトリ、a3
はシンボリックリンクです。それらはすべてディレクトリエントリを持ち、シェルのワイルドカード拡張は、それらのエントリがどの種類のエンティティを参照するかを気にしません。
実際に実行される可能性のあるすべてのシェル(bash、sh、ksh、zsh、csh、tcshなど)は、ワイルドカードを実装しています。詳細は異なる場合がありますが、ゼロ以上の文字に一致する*
と単一の文字に一致する?
の基本的な構文は、ある程度一貫しています。
特にbashの場合、これはbashマニュアルの「ファイル名の展開」セクションに記載されています。 info bash
を実行して「ファイル名の展開」を検索するか、 ここ を参照してください。
これが個々のコマンドではなくシェルによって行われるという事実は、興味深い(そして時には意外な)結果をもたらします。それについての最も良いことは、ワイルドカードの処理が(ほぼ)allコマンドで一貫していることです。シェルがこれを行わなかった場合、必然的にいくつかのコマンドは邪魔にならず、他のものは作者が「より良い」と考えた微妙に異なる方法でそれを行います。 (Windowsのコマンドシェルにはこの問題があると思いますが、さらにコメントするのに十分に慣れていません。)
一方、複数のファイルの名前を変更するコマンドを書くことは困難です。あなたが書く場合:
mv *.log *.log.bak
*.log.bak
は、現在のディレクトリに既に存在するファイルに基づいて展開されるため、おそらく失敗します。この種のことを行うコマンドがありますが、独自の構文を使用して、ファイルの名前を変更する方法を指定する必要があります。一部のコマンド(find
など)は、独自のワイルドカード展開を実行できます。シェルの展開を抑制するには、引数を引用する必要があります。
find . -name '*.txt' -print
シェルのワイルドカード展開は、コマンドライン引数の構文と既存のファイルのセットに完全に基づいています。 できないコマンドの意味の影響を受けます。たとえば、すべての.log
ファイルを親ディレクトリに移動する場合は、次のように入力できます。
mv *.log ..
..
を忘れた場合:
mv *.log
たまたま現在のディレクトリにちょうど2つの.log
ファイルがあると、次のように展開されます。
mv one.log two.log
one.log
とclobber two.log
の名前を変更します。
[〜#〜] edit [〜#〜]:そして、52件の賛成票、承認、およびグルバッジを取得したら、実際に質問に答える必要がありますタイトルに。
ls
の-d
または--directory
オプションは、ディレクトリのみをリストするようには指示しません。内容ではなく、ディレクトリ自体をリストするように指示します。 ls
の引数としてディレクトリ名を指定すると、通常はディレクトリのcontentsが一覧表示されます。これは通常、これが目的であるためです。-d
オプションは、ディレクトリのみを一覧表示するように指示します。これは、ワイルドカードと組み合わせると特に便利です。入力した場合:
ls -l a*
ls
は、名前がa
で始まる各fileと、名前が始まる各ディレクトリのcontentsの長いリストを提供しますa
。ファイルとディレクトリのリストが必要な場合は、1行ずつ、次のように使用できます。
ls -ld a*
これは次と同等です:
ls -l -d a*
ls
コマンドが*
文字を認識することはありません。
これが文書化されている場所に関しては、man ls
は、ほぼすべてのUnixライクなシステムでのls
コマンドの文書を表示します。ほとんどのLinuxベースのシステムでは、ls
コマンドはGNU coreutilsパッケージの一部です。info
コマンドがある場合は、info ls
またはinfo coreutils ls
は、より明確で包括的なドキュメントを提供するはずです。MacOSなどの他のシステムでは、ls
コマンドの異なるバージョンを使用していて、info
コマンドがない場合があります。これらのシステムではman ls
を使用します。_ls --help
は比較的短い使用法のメッセージ(私のシステムでは117行)ifを使用しますGNU coreutils実装。
そして、はい、専門家でさえ時々ドキュメントを参照する必要があります。 this classic joke も参照してください。
キース・トンプソンの答えを見てください。しかし、なぜls --directory a*
はファイルを表示しますandディレクトリ:--directory
オプションは、ディレクトリ以外のファイルを抑制しません。代わりに、それ自体がディレクトリをリストしますが、それ以外の場合はコンテンツをリストします。例:
$ mkdir foo
$ touch foo/bar
$ ls foo
bar
$ ls --directory foo
foo
非常に明確にするために、それは ls(1)マニュアルページ に文書化されています:
-d、--directory内容の代わりにディレクトリエントリをリストし、シンボリックリンクを逆参照しません
公平に言うと、「内容ではなくエントリ」のほうが説明的である可能性があります。
FILEがディレクトリの場合、そのディレクトリの内容をリストするのではなく、ディレクトリエントリ自体を表示します。 FILEがシンボリックリンクの場合、リンクが指すファイルではなく、リンクエントリ自体を表示します。
説明したように、*
の拡張(および同様の拡張)はUnixの専門用語ではglob
bingと呼ばれ、通常はコマンドプロセッサの機能です(Unixの用語では「シェル」と呼ばれます)。したがって、グロビングは他の多くの場所でも使用できます。 glob
bingの詳細については、クラシックLinuxディストリビューションのシェルでman 7 glob
と入力してください(または this を参照)。
初期のUnixでは、glob
は実際には 別のプログラム と呼ばれ、/etc/glob
と呼ばれていました(そのドキュメントについては、 この古いUNIXマニュアル の10ページを参照してください)。現在、これはコードライブラリによって提供されるコードルーチンであり、一般的にシェルで使用されます。 ソース: Wikipedia 。
ls -d
がファイルとディレクトリを一覧表示する理由について...
ls
のマニュアルページ は、これが発生する理由を説明していますが、非常に簡潔な説明です。だからここに拡張された説明の試みがあります:
デフォルトでは、ls
は、名前が指定されたときにディレクトリのcontentsをリストし、ディレクトリへのsymlinksに対して同じことを行います。 -d
オプションは、 「ディレクトリの名前が指定された場合」(glob
bingにより暗黙的にを指定することもできます)、ディレクトリの_name_sのみを表示しますが、その内容はではありません。同様に、directoriesへのシンボリックリンクの(明示的またはimplicitly)名を指定すると、シンボリックリンクのファイル名が表示されます、それが参照するディレクトリの内容ではありません。
-d
オプションは、どの項目がリストされているかを知る限り、私が知る限り何もしません。これは、find . -maxdepth 1 -type d
のように、find
で(ソース: here )実行できます。 GNU ls
。 ここ でのみこれを行う良い方法があるかどうかはわかりませんが、find
コマンドの使用例です。
つまり、デフォルトでは、ls
は、パス名を指定すると、ディレクトリの内容を表示します。 -d
は、この動作を変更し、標準ファイルの場合と同様に、ディレクトリ名自体のみを表示します。
ドキュメントはそれがリストされているとは述べていませんonlyディレクトリエントリバーではなくls
がディレクトリ名を受け取ったときにdirエントリがリストされますの代わりにそれはコンテンツです。理解する最良の方法は例です:
> {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 /
ドキュメントはShellの一部です。特に、シェルはコマンドを実行する前に、特定の順序でさまざまな拡張と置換を実行します。
Word展開の互換性のあるBourne Shellの場合 のシーケンスは、
そのため、ls
コマンドは*
文字すら見えません。引数は、a*
グロブパターンに一致するすべてのファイルですでに展開されています。これは、ファイル名の展開を必要とする各コマンドがこの機能自体を実装する必要があるWindowsとは異なります。
必要なキーワード(man bash
)は「パス名拡張」です。