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

答え2

コマンドのlsデフォルト値は次のとおりですls .現在のディレクトリのすべての項目を一覧表示

このコマンドは、ls *「シェルモードで拡張に対してlsを実行する*」を意味します。

この*パターンはシェルによって処理され、で始まるエントリを除く現在のディレクトリのすべてのエントリに展開されます.

デュアルモードまたはトリプルモードの解釈は、使用される*実際のシェルによって異なります。

*ゼロ個以上の文字に一致するワイルドカード文字です。いくつかの現代のシェルは、**このパターンを見るとサブディレクトリとして繰り返されます。

答え3

echolsコマンドが拡張される理由を確認するために、最初に入力するのではなく、入力してプロセス全体を簡単に理解できます。

$ echo *
Applications Downloads Documents tmp.html

したがって、この場合はls *次のように拡張されます。ls Applications Downloads Documents tmp.html

$ echo **
Applications Downloads Documents tmp.html

$ echo ***
Applications Downloads Documents tmp.html

だから何も変わりませんでした。これはbash、ほとんどの人が使用しているシェルを使用していると仮定し、他のシェルは異なる動作をします。ashorcshまたはkshorを使用すると、zsh状況が変わると予想できます。それが異なるシェルを持つポイントです。

したがって、globbing()演算子が私たちのために何ができるかをbash理解するために他のことを試してみましょう(まだ使用しています)。*たとえば、名前の一部に基づいてフィルタリングできます。

$ echo D*
Downloads Documents

興味深いことに、末尾のスラッシュはすべてのディレクトリ名の暗黙的な部分です。したがって、*/ディレクトリ(およびディレクトリへのシンボリックリンク)のみが生成されます。

$ echo */
Applications/ Downloads/ Documents/

スラッシュを中央に配置して、複数レベルのフィルタリングを実行できます。

$ echo D*/*/
Documents/Work/ /Documents/unfinished/

ディレクトリDownloadsにはサブディレクトリが含まれていないため、出力には表示されません。必要なファイルだけを確認するのに便利です。私は次のコマンドを使用してきました。

$ ls -l /home/*/public_html/wp-config.php

wp-config.phpこれには、ユーザーディレクトリ(存在する場合)のデフォルトレベルに存在するすべてのファイルが一覧表示されますpublic_html。それとももっと完璧かもしれません。

$ find /home/*/public_html/ -name wp-config.php

wp-config.phpこれにより、すべてのユーザーディレクトリまたはそのサブディレクトリpublic_html内のすべてのファイルを見つけることができますが、find /home/ -name wp-config.php何も確認しないだけでなく、より効率的に実行されます。しかし、public_html各ユーザーのディレクトリです。

答え4

「もっと詳しく」知りたい場合は、ls -R(再帰)オプションを使用するか、以下のようにfindを使用してください。

find . -ls

"find"はディレクトリツリーの一番下までドリルダウンし("ls -R"に似ています)、ディレクトリの一覧表示(-type d)、ファイルのみの表示(-type f)、追加の項目を含むファイルの表示など、より多くのオプション提供します。コンテンツファイル属性(/ etc / passwdにユーザーがいない、特定の権限など)「検索」はスクリプトでも安全です(シェル間の一貫性のないワイルドカードルール、ダッシュを使用したファイルの特殊なエスケープなどによる)。

シェルワイルドカードワイルドカードは、ドットファイルのアスタリスク「*」では使用できません。ドットファイルのみを一覧表示するには、次のようにします。

ls .??*

関連情報