我的目录的内容是
$ 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中,如果没有day
或night
文件,最后两个命令将失败;设置nonomatch
或csh_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