在 shell 通配符中使用 OR 模式

在 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文件名部分。

原来的场景,目录中有很多文件,缩短了询问的情况。

答案1

您甚至不需要启用扩展通配符即可执行您想要的操作。这将在 bash 中工作:

ls {day*,night*}

答案2

没有选项ls可以过滤文件名,但在大多数 shell 中都有通配扩展名man bash /Pattern Matching

克什

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

桀骜

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}*

在任何 shell 中您都可以执行以下操作:

ls -lrtd -- *day* *night*

在zsh中,如果没有daynight文件,最后两个命令将失败;设置nonomatchcsh_null_glob选项,或(N)在每个模式后添加以避免这种情况。

答案3

Shell 不使用正则表达式进行参数扩展。

您可以通过以下方式启用扩展模式匹配

$ shopt -s extglob

进而

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

例如,参见Bash 参考手册(模式匹配)

答案4

您可以ls使用grep以下管道

aashutosh@ubuntu:/tmp$ ls -ltrh
total 0
-rw-rw-r-- 1 aashutsh user 0 May  9 02:55 noon.txt
-rw-rw-r-- 1 aashutsh user 0 May  9 02:55 night.txt
-rw-rw-r-- 1 aashutsh user 0 May  9 02:55 day.txt

aashutosh@ubuntu:/tmp$ ls -ltr | grep 'night\|day'
-rw-rw-r-- 1 aashutsh user 0 May  9 02:55 night.txt
-rw-rw-r-- 1 aashutsh user 0 May  9 02:55 day.txt

相关内容