このコマンドを使用すると、すべてのディレクトリが一覧表示されることがわかります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
。。
答え2
コマンドのls
デフォルト値は次のとおりですls .
。現在のディレクトリのすべての項目を一覧表示。
このコマンドは、ls *
「シェルモードで拡張に対してlsを実行する*
」を意味します。
この*
パターンはシェルによって処理され、で始まるエントリを除く現在のディレクトリのすべてのエントリに展開されます.
。
デュアルモードまたはトリプルモードの解釈は、使用される*
実際のシェルによって異なります。
*
ゼロ個以上の文字に一致するワイルドカード文字です。いくつかの現代のシェルは、**
このパターンを見るとサブディレクトリとして繰り返されます。
答え3
echo
ls
コマンドが拡張される理由を確認するために、最初に入力するのではなく、入力してプロセス全体を簡単に理解できます。
$ 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
、ほとんどの人が使用しているシェルを使用していると仮定し、他のシェルは異なる動作をします。ash
orcsh
またはksh
orを使用すると、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 .??*