シェルワイルドカードでORパターンを使用する


52

私のディレクトリの内容は

$ ls -lrt
total 0
-rw-r--r-- 1 user1 admin 19 Oct  8 12:31 night.txt
-rw-r--r-- 1 user1 admin 19 Oct  8 12:31 noon.txt
-rw-r--r-- 1 user1 admin 38 Oct  8 12:31 day.txt

指定したファイル名に単語が含まれているファイルの詳細を一覧表示したいと思います。

例:

$ ls -lrt *day|night*
ls: *day: No such file or directory
bash: night.txt: command not found

期待される出力

-rw-r--r-- 1 user1 admin 19 Oct  8 12:31 night.txt
-rw-r--r-- 1 user1 admin 38 Oct  8 12:31 day.txt

2つの異なるpartternに一致する異なるファイルをリストする方法、または要するに、regexを使用してlsORファイル名の部分を作成する方法。

元のシナリオでは、ディレクトリ内に多くのファイルがあり、質問のケースを短縮しています。

回答:


65

あなたが望むことをするために拡張グロビングを有効にする必要さえありません。これはbashで動作します:

ls {day*,night*}

7
A:いいえ、それはしていませんtouch day.txt; touch night.txt; ls {*day,night*}で結果ls: *day: No such file or directory
マッテオ

1
私は元のポスターのテキストを適応させていました。それは明らかだと思いました。 ため息。テキストが更新されました。確かに、メカニズムが機能していることがわかりますか?
-itsbruce

7
または*{day,night}*、OPが望むものに近い可能性があります。
-derobert

25

lsファイル名でフィルタリングするオプションはありませんが、ほとんどのシェルにはグロビング拡張子がありますman bash /Pattern Matching

ksh

ls -lrtd -- *@(day|night)*

zsh

setopt extendedglob
ls -lrtd -- *(day|night)*

または:

setopt kshglob
ls -lrtd -- *@(day|night)*

バッシュ

shopt -s extglob
ls -lrtd -- *@(day|night)*

これらの3つのシェルのいずれでもこれを行うことができますが、いずれかのケースがどのファイルにも一致しない場合、そのパターンは展開されないままになることに注意してください(たとえば*day* night1.txt othernight.txtday;を含むファイル名がない場合man bash /EXPANSION/Brace Expansion具体的には)

ls -lrtd -- *{day,night}*

どのシェルでも次のことができます。

ls -lrtd -- *day* *night*

zshでは、no dayまたはnightfileがある場合、最後の2つのコマンドは失敗します。nonomatchまたはcsh_null_globオプションを設定するか、(N)これを回避するために各パターンの後に追加します。


1
どうでしょう*{day,night}*。編集しますが、どのシェルがそれをサポートしているかわかりませんか?
Random832

Random832作品で、@ bashksh、およびzsh(なし必要がグロブ拡張)ではなく、shしかし、ナウエルの最後の「すべてのシェル」の例は、で仕事をします- sh
イズカタ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.