アンカーはgrepでのみ使用できますか、それとも他のコマンドと一緒に使用できますか?
たとえば、
ls -l ^cat
答え1
正規表現アンカー(例:^
と)は、$
次のツールでのみ解析されます。実装するよく使われる表現。 ls
そんなツールじゃないから使えません。ただし、シェルから呼び出されたすべてのバイナリは、よりシンプルで強力なワイルドカードベースの検索メカニズムであるシェルワイルドカードを使用できます。
たとえば、名前がcatで始まるすべてのファイルのリストの場合:
$ ls cat* # lists all files with names which start with 'cat'
$ ls *dog # lists all files with names which end with 'dog'
$ ls d*y # Lists all files which names which start with 'd' and end
with 'y', e. g. 'donkey'
$ ls p?g # Lists all files which start with 'p', have one additional
character, and end with 'g', e. g. 'pig' and 'pug'
ワイルドカードの場合は*
「0個以上の文字」を意味し、?
「正確に1個の文字」を意味します。
答え2
この/bin/ls
プログラムは他のプログラムと同様にパターンを扱いません*
。ワイルドカードによってUnixシェル、実行中のプログラムではなく説明します。
このls
プログラム(いくつかの実装があります)フリーソフトウェア、GNUのようにコアツールパッケージなので、自由にソースコードを研究してみてください。)得る文字列シーケンス(2番目のパラメータ)それ main
機能)拡大するシェルを通して(しばしばbash
)。これは具体的ではなく、ls
シェルで実行されているすべてのプログラムに当てはまります(通常道)。
たとえば、、、、a.c
ファイルを含むディレクトリでは、このコマンドは拡張されますa.o
。b.c
d.c
e.h
ls *.c
シェルを通してls a.c b.c d.c
(この場合)このように入力すると、ls
4つの引数が提供されます。最初の(インデックス0)はls
、2番目(インデックス1)はa.c
等...、4番目(インデックス3)はですd.c
。だからls
プログラムは見たことがない *.c
殻は実行(2)- 4つのパラメータで処理します。シェルによって実行されるプログラムパラメータ拡張を呼び出します。ワイルドカード。読むグローバル(7)そして理解するIFS
シェル変数。
(場合によっては注意してください。始めるあなたのようなファイルは次のように$HOME/.bashrc
定義できます。ls
ニックネーム;次に、このカテゴリ名の拡張を避けるためにorまたはls
に置き換えます(後者の2つは、次のようにオーバーライドをバイパスするためにも使用できます)。\ls
command ls
/bin/ls
ls
機能))
拡張によって何が起こるのかを理解するのに非常に便利な方法は、まず次のものを使用することです。オートコンプリートシェル(たとえばTABキーを使用)を実行するか、コマンド(あなたの場合ls
)をecho
。
もしそうなら、あなたが本当に欲しいもの拡張ワイルドカード付きシェル。いくつか見つけることができ、これを行うために独自のシェルを作成できます。
西さまざまな拡張があります(Schemeでコーディングできます)。
既存のシェル(ほとんどはフリーソフトウェアであり、ソースコードを研究することができます)を必要に応じて調整するか、自分で作成してください。
今後、sash
非常にシンプルで小さなシェル(少しバグがあります)で、ソースコードは読みやすいです。
Posix シェルに類似強く打つ、 - など、例:魚- あなたはそれを使用することができますコマンドの置き換え、例えば、検索(1)(一部でもls
管路someに入れるgrep
のはls -l $(ls | grep '^foo')
少し役に立たず、空白や改行文字を含むファイル名など、一部の場合は機能しません。なぜならls -l foo*
)と同じだからです。
一部のコマンドは、特定のコマンドとともにワイルドカードとして表示されます(通常リーダー)パラメータまたはデータ(例:検索(1);たとえば、次のようなプログラムを書くことができます。グローバル(3)または単語表現(3)。ところで、正規表現を使用できます(提供:正規表現(1)など...)また、プログラムで正規表現(3)機能。
独自のシェルを作成するのは非常に興味深い作業なので、試してみることを強くお勧めします。使い方を学ぶ必要があります。システムコール(2)、例えば本を読むことによって。高度なLinuxプログラミング、独自のワイルドカードを実装してください。理解して(トラック(1))何システムコールいくつかのシェルで行うことも価値があります。
実際にls ^cat
名前があなたで始まるすべてのファイルを一覧表示するという意味であれば、シェルにコマンドを入力するだけですcat
。ls cat*
ところで、私はzsh
本当に私が好きですインタラクティブシェル(IMHOオートコンプリート機能がうまく機能し、拡張機能拡張が本当に役に立つからです)、それは好みの問題なのでYMMVです。ただし、試してみることはできます(これを採用する場合は、次のようにログインシェルを変更してください)。chsh(1))。
最後に、自分のファイル名にスペース(改行、制御文字、およびほとんどの句読点を含む)を避けることをお勧めします。したがって、ラテン文字と数字、ドット.
、パーセント記号%
、アンダースコア、_
プラス記号+
、開始しないダッシュ-
またはチルダのみを使用してください~
。 .) ただし、他の人が一般的に使用するためにシェルスクリプトを作成するときは、スペースと奇妙な文字を含むファイル名を考慮してください。使用"$@"
このようなスクリプトではより良いです。
PS。噂によると、Windowsでは(わかりません)状況が異なり、ワイルドカードはいくつかのスタートアップコードによって行われます。crt0またはあなたはmain
読むことができます。オペレーティングシステム:3つの簡単な部分より広い視野を得るためだ。
答え3
他の人が説明したように、ls
正規表現のサポートは提供されません。ただし、find
以下に示すように、GNU固有の正規表現に一致するファイルを一覧表示することは可能です。
まず、次のls
タスクを使用できます。
find * -maxdepth 0 -regex "ANY_REGEX" -ls
また、この-exec
操作により、すべてのコマンドを使用できます。
find * -maxdepth 0 -regex "ANY_REGEX" -exec ls -la {} \+
find
最後にこれをと組み合わせることができますxargs
。たとえば、次のようになります。
find * -regex "ANY_REGEX" -print0 | xargs -0 ls -la
デフォルトでは、find
すべてのサブディレクトリが検索されるため、アクションを複製するためのls
フィルタを追加しました-maxdepth 0
。
前の例の操作とオプションは、スペースを含むファイル名を処理するために-print0
必要です。この点を指摘してくれた@ilkkachuに感謝します。find
-0
xargs
答え4
正規表現「with」を使用できますが、ls
に渡す必要がありますgrep
。
ls | grep ^cat | xargs -r ls -l
Bashは、句とループを=~
必要とする比較演算子を介してのみ正規表現をサポートします。if
for
for x in *; do if [[ "$x" =~ ^cat ]]; then ls -l "$x"; fi; done