ls *、ls**、およびls***の結果

ls *、ls**、およびls***の結果

このコマンドを使用すると、すべてのディレクトリが一覧表示されることがわかりますls。しかし、ls *この命令は何をしますか?私はこれを使用しましたが、ディレクトリだけを一覧表示します。前のアスタリスクは、lsディレクトリがどのくらい深くリストされているかを意味しますか?

ベストアンサー1

ls引数として渡されたファイルとディレクトリの内容を一覧表示するか、引数が指定されていない場合は現在のディレクトリを一覧表示します。動作に影響を与えるいくつかのオプションを渡すこともできます(man ls詳細については参考資料を参照)。

lsという引数を渡すと、現在のディレクトリから呼び出されているファイルまたはディレクトリが見つかり、他のファイルや*ディレクトリと同じように一覧表示されます。キャラクターは他の方法で扱われません。*ls*

しかしls *シェルコマンドライン、つまりUnixシェル言語で書かれたコードすると、シェルは次の*ように拡張します。ワイルドカード(また〜として知られているファイル名の生成またはファイル名/パス名拡張子)ルール。

さまざまなシェルがさまざまなワイルドカード演算子をサポートしていますが、ほとんどは最も単純な演算子に同意します**as パターンは任意の数の文字を表すため、*as はglobパターンと一致する現在のディレクトリのファイルのリストに展開されます。 1つの例外があります。ファイル名の先行点()文字は明示的に一致する必要があるため、実際には.(語彙的に)で始まらない*ファイルとディレクトリのリストに展開されます。.

たとえば、現在のディレクトリに.、、..というファイルが含まれている場合、シェルはそれを2つの引数に拡張して:とに渡す.fooので、次のように入力します。-lfoo bar*ls-lfoo 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個(隠しファイルを除く)³。*******/*

bashksh93数年後(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、.***zshD グローバル予選(たとえば**/*(D)、隠しファイルとディレクトリが考慮されますが、隠されたファイルを拡張せずに隠されたディレクトリのみを参照するか、または((*|.*)/)#*必要です**/[^.]*(D))。

またサポートされます**。以前のバージョンと同様に、bashディレクトリツリーが下がるとシンボリックリンクに従います。ただし、そのシェルでは**/*同じではありません****複数のディレクトリにまたがる可能性がある拡張機能がたくさんあります。*ここでは一致しますfishが一致しませんが、一致し、たとえばandで記述する必要があります。そこには、次のような内容が従うことがわかります。**/*.ca/b/c.ca.ca**.ca.cab/c/d.czsh**/.*{,**/}.*********

tcshV6.17.01(2010年5月)にもオプションが追加され、à laのglobstarサポートが追加されました。*****zsh

したがって、in tcshbashand ksh93、(オプション(globstar)が有効な場合)orは、fish現在の**ファイルとディレクトリの下のすべてのファイルとディレクトリを拡張し、***forと同じでwithでシンボリックリンクを通過し、inとと同じです。 (これらの将来のバージョンのシェルはシンボリックリンクを通過する可能性もあります)。**fish**tcshglobstar*bashksh93

上記では、どの拡張もオプションとして解釈されないようにする必要があることがわかります。これを行うには、次の手順を実行します。

ls -- *

または:

ls ./*

一部のファイル名も特別に扱うことができるので、ls2番目のコマンドがより望ましいいくつかのコマンド(重要でない場合)があります。これは、この文字を含むほとんどのテキストユーティリティとファイル名の場合です。すべての引数の前に追加すると、その引数の特別な意味が削除されます(少なくとも上記の場合)。---cdpushd=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]cshtcshzsh矛盾エラーが発生したため呼び出されませんrm(ワイルドカードはfishサポートされていません[...])。

*にリテラルを渡すには、orまたは同じ方法で文字を引用するls必要があります。 POSIXに似たシェルでは、またはを使用してワイルドカードを完全に無効にできます(後者は/エミュレーションを除いて効果はありません)。*ls \*ls '*'ls "*"set -o noglobset -fzshshksh


1常にサポートされていましたが、最初はzsh-2.0(そしておそらくそれ以前(*/)#)で労働力が不足していました。..../****/**/

²のglobstarshortオプション**、それぞれ、代わりに、およびを使用できるように後で追加されました(2015)。*****/****/*

³以下も参照してくださいksh93デザインglobstarにも奇妙なことがあります、その一部がコピーされましたbash

おすすめ記事