Bash

在 shell 萬用字元中使用 OR 模式

  • March 11, 2015

我的目錄的內容是

$ 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 中,如果有 nodaynightfile,則最後兩條命令會失敗;設置nonomatchorcsh_null_glob選項,或(N)在每個模式之後添加以避免這種情況。

引用自:https://unix.stackexchange.com/questions/50220