Menggunakan pola ATAU dalam wildcard shell

52

Isi dari dir saya adalah

$ 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

Saya ingin daftar rincian file yang memiliki kata dalam nama file seperti yang ditentukan.

Contoh:

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

Output yang diharapkan

-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

Cara daftar file yang berbeda cocok dengan 2 partterns berbeda, atau singkatnya cara menggunakan regex dengan ls, sehingga saya bisa ORbagian nama file.

Skenarion asli, ada banyak file di direktori, telah mempersingkat kasus untuk bertanya.

mtk
sumber

Jawaban:

65

Anda bahkan tidak perlu globbing diperpanjang diaktifkan untuk melakukan apa yang Anda inginkan. Ini akan bekerja di bash:

ls {day*,night*}
itu otaknya
sumber
7
Tidak itu tidak: touch day.txt; touch night.txt; ls {*day,night*}hasil dalamls: *day: No such file or directory
Matteo
1
Saya mengadaptasi teks poster asli; Saya pikir itu sudah jelas. desah . Teks diperbarui. Tentunya Anda dapat melihat bahwa mekanismenya bekerja?
itsbruce
7
Atau mungkin *{day,night}*lebih dekat dengan apa yang diinginkan OP.
derobert
25

Tidak ada opsi lsuntuk memfilter pada nama file tetapi di sebagian besar shell ada ekstensi globbingman bash /Pattern Matching

ksh

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

zsh

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

atau:

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

pesta

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

Dalam salah satu dari tiga shell ini Anda dapat melakukan ini, tetapi perhatikan bahwa jika salah satu case tidak cocok dengan file apa pun, pola itu akan dibiarkan tidak diperluas (mis. *day* night1.txt othernight.txtJika tidak ada nama file yang mengandung day; lihat man bash /EXPANSIONatau /Brace Expansionsecara khusus):

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

Dalam setiap kerang yang dapat Anda lakukan:

ls -lrtd -- *day* *night*

Di zsh, jika tidak ada dayatau nightfile, dua perintah terakhir akan gagal; atur opsi nonomatchatau csh_null_glob, atau tambahkan (N)setelah setiap pola untuk menghindari ini.

Nahuel Fouilleul
sumber
1
Bagaimana dengan *{day,night}*. Saya akan mengeditnya, tetapi saya tidak tahu cangkang mana yang mendukungnya?
Random832
@ Random832 Berfungsi di bash,, kshdan zsh(tidak perlu diperpanjang globbing), tetapi tidak sh- namun, contoh terakhir "semua kerang" Nahuel bekerja di sh.
Izkata
14

Shells tidak menggunakan ekspresi reguler untuk ekspansi argumen.

Anda dapat mengaktifkan pencocokan pola yang diperluas dengan

$ shopt -s extglob

lalu

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

Lihat misalnya Manual Referensi Bash (Pencocokan Pola)

Matteo
sumber