私のディレクトリの内容は
$ 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
できるようにする方法。
オリジナルのシナリオでは、ディレクトリに多くのファイルがあり、尋ねるケースを短縮しました。
必要なことを実行するために拡張グロビングを有効にする必要さえありません。これはbashで動作します:
ls {day*,night*}
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.txt
。 man bash
/EXPANSION
または/Brace Expansion
特に):
ls -lrtd -- *{day,night}*
どのシェルでもできる:
ls -lrtd -- *day* *night*
Zshでは、day
またはnight
ファイルがない場合、最後の2つのコマンドは失敗します。これを回避するには、nonomatch
またはcsh_null_glob
オプションを設定するか、各パターンの後に(N)
を追加します。
シェルは、引数の展開に正規表現を使用しません。
拡張パターンマッチングを有効にするには、
$ shopt -s extglob
その後
$ ls @(day|night).txt
day.txt night.txt
たとえば Bashリファレンスマニュアル(パターンマッチング) を参照してください。