このコマンドを使用すると、すべてのディレクトリが一覧表示されることがわかりますls
。しかし、ls *
この命令は何をしますか?私はこれを使用しましたが、ディレクトリだけを一覧表示します。前のアスタリスクは、ls
ディレクトリがどのくらい深くリストされているかを意味しますか?
ベストアンサー1
ls
引数として渡されたファイルとディレクトリの内容を一覧表示するか、引数が指定されていない場合は現在のディレクトリを一覧表示します。動作に影響を与えるいくつかのオプションを渡すこともできます(man ls
詳細については参考資料を参照)。
ls
という引数を渡すと、現在のディレクトリから呼び出されているファイルまたはディレクトリが見つかり、他のファイルや*
ディレクトリと同じように一覧表示されます。キャラクターは他の方法で扱われません。*
ls
*
しかしls *
、シェルコマンドライン、つまりUnixシェル言語で書かれたコードすると、シェルは次の*
ように拡張します。ワイルドカード(また〜として知られているファイル名の生成またはファイル名/パス名拡張子)ルール。
さまざまなシェルがさまざまなワイルドカード演算子をサポートしていますが、ほとんどは最も単純な演算子に同意します*
。*
as パターンは任意の数の文字を表すため、*
as はglob
パターンと一致する現在のディレクトリのファイルのリストに展開されます。 1つの例外があります。ファイル名の先行点()文字は明示的に一致する必要があるため、実際には.
(語彙的に)で始まらない*
ファイルとディレクトリのリストに展開されます。.
たとえば、現在のディレクトリに.
、、..
というファイルが含まれている場合、シェルはそれを2つの引数に拡張して:とに渡す.foo
ので、次のように入力します。-l
foo bar
*
ls
-l
foo bar
ls -l "foo bar"
または
'ls' "-l" foo\ bar
同じコマンドを実行する3つの方法があります。 3 つの場合すべて、ls
コマンド (説明ディレクトリー照会/bin/ls
で$PATH
) には、「ls」、「-l」、および「foo bar」という 3 つのパラメーターが渡されます。
ところで、この場合はls
最初(厳密に言えば第二)1つはオプションとして提供されます。
今私が言ったように、シェルごとにワイルドカードが異なります。数十年前に演算子1がzsh
導入され、すべてのレベルのサブディレクトリと一致することが意図されていました。これはandの略語で、ディレクトリ下降時にシンボリックリンクに従うことを除けば同じです。**/
(*/)#
***/
数年前(2003年7月ksh93o+
)ksh93
、この動作を複製することにしましたが、オプションとして作成し、ケースのみを扱うことにしました**
(そうではありませんでした***
)。また**
、aloneは²では特別ではありませんが(他の従来のシェルと同じ意味を持ちます。zsh
なぜなら、これは任意の数の文字の後に任意の数の文字が続くことを意味するためです)ksh93では(したがって、現在のすべての項目と同じ意味を持ちます))ディレクトリ)ファイルまたはディレクトリ)は同じです。 1個(隠しファイルを除く)³。*
**
**
**/*
bash
ksh93
数年後(2009年2月、bash 4.0)、同じ構文でコピーされましたが、1つの不幸な違いがあります。 bashはs**
に似ています。つまり、サブディレクトリにループするときはシンボリックリンクに従いますが、通常はそうではありません。望むが不快な副作用があるかもしれません。 bash-4.3ではシンボリックリンクに従い続けますが、再帰はそこで停止するため部分的に修正されました。 5.0で完全に修正されました。zsh
***
yash
**
2008年バージョン2.0に追加され、extended-glob
オプションで有効になりました。その実装はzsh
それ自体が特別ではないという点で'sに近いです**
。バージョン2.15(2009)では、***
inzsh
と2つの独自の拡張機能が追加され、繰り返し時に隠されたディレクトリが含まれています(.**
in、.***
zsh
D
グローバル予選(たとえば**/*(D)
、隠しファイルとディレクトリが考慮されますが、隠されたファイルを拡張せずに隠されたディレクトリのみを参照するか、または((*|.*)/)#*
必要です**/[^.]*(D)
)。
魚またサポートされます**
。以前のバージョンと同様に、bash
ディレクトリツリーが下がるとシンボリックリンクに従います。ただし、そのシェルでは**/*
同じではありません**
。**
複数のディレクトリにまたがる可能性がある拡張機能がたくさんあります。*
ここでは一致しますfish
が一致しませんが、一致し、たとえばandで記述する必要があります。そこには、次のような内容が従うことがわかります。**/*.c
a/b/c.c
a.c
a**.c
a.c
ab/c/d.c
zsh
**/.*
{,**/}.*
***
**
*
**
tcsh
V6.17.01(2010年5月)にもオプションが追加され、à laのglobstar
サポートが追加されました。**
***
zsh
したがって、in tcsh
、bash
and ksh93
、(オプション(globstar
)が有効な場合)orは、fish
現在の**
ファイルとディレクトリの下のすべてのファイルとディレクトリを拡張し、***
forと同じでwithでシンボリックリンクを通過し、inとと同じです。 (これらの将来のバージョンのシェルはシンボリックリンクを通過する可能性もあります)。**
fish
**
tcsh
globstar
*
bash
ksh93
上記では、どの拡張もオプションとして解釈されないようにする必要があることがわかります。これを行うには、次の手順を実行します。
ls -- *
または:
ls ./*
一部のファイル名も特別に扱うことができるので、ls
2番目のコマンドがより望ましいいくつかのコマンド(重要でない場合)があります。これは、この文字を含むほとんどのテキストユーティリティとファイル名の場合です。すべての引数の前に追加すると、その引数の特別な意味が削除されます(少なくとも上記の場合)。--
-
cd
pushd
=
awk
./
$FIGNORE
また、ほとんどのシェルにはワイルドカードの動作に影響を与える多くのオプションがあることに注意する必要があります(たとえば、ドットファイルを無視するかどうか、ソート順、不一致がある場合の対処方法など)。ksh
csh
またtcsh
、およびifを除くすべてのfish
シェルでzsh
ワイルドカードパターン一致するファイルがなく、パターンが拡張されていない引数として渡されるため、混乱やエラーが発生する可能性があります。たとえば、現在のディレクトリに隠されていないファイルがない場合
ls *
実際には2つのパラメータでls
呼び出されます。ファイルがまったくなく、電話をかける人もいないため、エラーメッセージが表示されます。ls
*
*
エルエス(シェルではありません)like:は人々が実際に領域を拡大していると思うようにls: cannot access *: No such file or directory
することが知られています。ls
次の場合、問題はさらに深刻になります。
rm -- *.[ab]
現在のディレクトリにnorファイルがないと、*.a
誤って呼び出されたファイル(、、)が削除される可能性があり、これが報告されます。*.b
*.[ab]
csh
tcsh
zsh
矛盾エラーが発生したため呼び出されませんrm
(ワイルドカードはfish
サポートされていません[...]
)。
*
にリテラルを渡すには、orまたは同じ方法で文字を引用するls
必要があります。 POSIXに似たシェルでは、またはを使用してワイルドカードを完全に無効にできます(後者は/エミュレーションを除いて効果はありません)。*
ls \*
ls '*'
ls "*"
set -o noglob
set -f
zsh
sh
ksh
1常にサポートされていましたが、最初はzsh-2.0(そしておそらくそれ以前(*/)#
)で労働力が不足していました。..../
****/
**/
²のglobstarshort
オプション**
、それぞれ、代わりに、およびを使用できるように後で追加されました(2015)。***
**/*
***/*
³以下も参照してくださいksh93デザインglobstar
にも奇妙なことがあります、その一部がコピーされましたbash
。。