在外壳通配符中使用OR模式


52

我的目录的内容是

$ 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将文件名分为几个部分。

原始脚本,目录中有很多文件,缩短了查询的情况。

Answers:


65

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

ls {day*,night*}

7
不,不是:touch day.txt; touch night.txt; ls {*day,night*}结果ls: *day: No such file or directory
Matteo

1
我正在修改原始海报的文字;我以为很清楚。 感叹。文字已更新。您肯定可以看到该机制有效吗?
itsbruce 2012年

7
或者可能*{day,night}*更接近OP的需求。
derobert

25

没有ls过滤文件名的选项,但是在大多数shell中,都有glob扩展名man bash /Pattern Matching

sh

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

sh

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; see man bash /EXPANSION/Brace Expansion专门的文件名):

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

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

ls -lrtd -- *day* *night*

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


1
那呢*{day,night}*?我会编辑它,但是我不知道哪个外壳支持它?
Random832

@ Random832可在bashksh和中使用zsh(不需要扩展glob),但不能使用sh-但是,Nahuel的最后一个“所有外壳”示例在中可使用sh
Izkata 2012年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.