Bash
在 shell 萬用字元中使用 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
我想列出文件名中包含指定單詞的文件的詳細資訊。
例子 :
$ 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 個不同部分匹配的不同文件,或者簡而言之,如何將 regex 與 一起使用
ls
,以便我可以找到OR
文件名部分。原來的場景,目錄中有很多文件,縮短了詢問的情況。
您甚至不需要啟用擴展 globbing 來執行您想要的操作。這將在 bash 中起作用:
ls {day*,night*}
沒有
ls
過濾文件名的選項,但在大多數 shell 中都有 globbing 副檔名man bash
/Pattern Matching
克什
ls -lrtd -- *@(day|night)*
zsh
setopt extendedglob ls -lrtd -- *(day|night)*
要麼:
setopt kshglob ls -lrtd -- *@(day|night)*
重擊
shopt -s extglob ls -lrtd -- *@(day|night)*
在這三個 shell 中的任何一個中,您都可以執行此操作,但請注意,如果其中一種情況與任何文件都不匹配,則該模式將保持未展開狀態(例如
*day* night1.txt othernight.txt
,如果沒有包含day
; 的文件名,請參閱man bash
/EXPANSION
或/Brace Expansion
專門):ls -lrtd -- *{day,night}*
在任何外殼中,您都可以執行以下操作:
ls -lrtd -- *day* *night*
在 zsh 中,如果有 no
day
或night
file,則最後兩條命令會失敗;設置nonomatch
orcsh_null_glob
選項,或(N)
在每個模式之後添加以避免這種情況。