lsにアンカー^$を使用できますか?

lsにアンカー^$を使用できますか?

アンカーは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.ob.cd.ce.hls *.cシェルを通してls a.c b.c d.c(この場合)このように入力すると、ls4つの引数が提供されます。最初の(インデックス0)はls、2番目(インデックス1)はa.c 等...、4番目インデックス3)はですd.c。だからlsプログラムは見たことがない *.c殻は実行(2)- 4つのパラメータで処理します。シェルによって実行されるプログラムパラメータ拡張を呼び出します。ワイルドカード。読むグローバル(7)そして理解するIFSシェル変数

(場合によっては注意してください。始めるあなたのようなファイルは次のように$HOME/.bashrc定義できます。lsニックネーム;次に、このカテゴリ名の拡張を避けるためにorまたはlsに置き換えます(後者の2つは、次のようにオーバーライドをバイパスするためにも使用できます)。\lscommand ls/bin/lsls機能))

拡張によって何が起こるのかを理解するのに非常に便利な方法は、まず次のものを使用することです。オートコンプリートシェル(たとえば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名前があなたで始まるすべてのファイルを一覧表示するという意味であれば、シェルにコマンドを入力するだけですcatls 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-0xargs

答え4

正規表現「with」を使用できますが、lsに渡す必要がありますgrep

ls | grep ^cat | xargs -r ls -l

Bashは、句とループを=~必要とする比較演算子を介してのみ正規表現をサポートします。iffor

for x in *; do if [[ "$x" =~ ^cat ]]; then ls -l "$x"; fi; done

関連情報