- 指定した場合、
ls --directory a*
次から始まるディレクトリのみa*
- ただし、次に始まるファイルとディレクトリが一覧表示されます。
a
質問:
man
私が徹底的に見た文書に加えて、この問題に関する文書をどこで見つけることができますかinfo
?- これはBASHにのみ適用されますか?
答え1
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
「ファイル名拡張」を実行して検索または確認してください。ここ。
これが単一のコマンドではなくシェルによって実行されるという事実は、いくつかの興味深い(時には驚くべき)結果をもたらします。最良の点はワイルドカード処理が(ほぼ)みんなコマンド;シェルがこれを行わない場合、必然的に一部のコマンドは問題になりませんが、他のコマンドは、作成者が「より良い」と見なす微妙に異なる方法で実行されます。 (私の考えでは、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 ls
MacOSなどの他のシステムでは、これらのシステムに対して異なるバージョンのコマンドを使用することも、使用しls
ないこともあります。info
man ls
ls --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 /