web-dev-qa-db-ja.com

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

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

$ 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

指定されたファイル名にWordが含まれているファイルの詳細をリストします。

例:

$ 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つの異なるパターンに一致するさまざまなファイルを一覧表示する方法、または簡単にlsで正規表現を使用して、ファイル名部分をORできるようにする方法。

オリジナルのシナリオでは、ディレクトリに多くのファイルがあり、尋ねるケースを短縮しました。

58
mtk

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

ls {day*,night*}
73
itsbruce

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

ksh

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

zsh

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

または:

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

bash

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

これら3つのシェルのいずれでもこれを行うことができますが、いずれかのケースがどのファイルとも一致しない場合、そのパターンは展開されないままになります(例:dayを含むファイル名がない場合は*day* night1.txt othernight.txtman bash/EXPANSIONまたは/Brace Expansion特に):

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

どのシェルでもできる:

ls -lrtd -- *day* *night*

Zshでは、dayまたはnightファイルがない場合、最後の2つのコマンドは失敗します。これを回避するには、nonomatchまたはcsh_null_globオプションを設定するか、各パターンの後に(N)を追加します。

27

シェルは、引数の展開に正規表現を使用しません。

拡張パターンマッチングを有効にするには、

$ shopt -s extglob

その後

$ ls @(day|night).txt
day.txt   night.txt

たとえば Bashリファレンスマニュアル(パターンマッチング) を参照してください。

14
Matteo