mtk*_*mtk 72 ls shell bash zsh wildcards
我的目录的内容是
$ 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
Run Code Online (Sandbox Code Playgroud)
我想列出文件名中包含指定单词的文件的详细信息。
$ ls -lrt *day|night*
ls: *day: No such file or directory
bash: night.txt: command not found
Run Code Online (Sandbox Code Playgroud)
-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
Run Code Online (Sandbox Code Playgroud)
如何列出与 2 个不同部分匹配的不同文件,或者简而言之如何使用 regex with ls,以便我可以OR获取文件名部分。
原来的情况,目录中有很多文件,缩短了查询的情况。
its*_*uce 90
您甚至不需要启用扩展的通配符来执行您想要的操作。这将在 bash 中工作:
ls {day*,night*}
Run Code Online (Sandbox Code Playgroud)
Nah*_*eul 29
没有选项ls可以过滤文件名,但在大多数 shell 中都有通配扩展名man bash /Pattern Matching
克什
ls -lrtd -- *@(day|night)*
Run Code Online (Sandbox Code Playgroud)
zsh
setopt extendedglob
ls -lrtd -- *(day|night)*
Run Code Online (Sandbox Code Playgroud)
或者:
setopt kshglob
ls -lrtd -- *@(day|night)*
Run Code Online (Sandbox Code Playgroud)
猛击
shopt -s extglob
ls -lrtd -- *@(day|night)*
Run Code Online (Sandbox Code Playgroud)
在这三个 shell 中的任何一个中,您都可以执行此操作,但请注意,如果其中一种情况与任何文件不匹配,则该模式将保持未扩展状态(例如,*day* night1.txt othernight.txt如果没有包含day; 的文件名,请参阅man bash /EXPANSION或/Brace Expansion具体说明):
ls -lrtd -- *{day,night}*
Run Code Online (Sandbox Code Playgroud)
在任何 shell 中,您都可以执行以下操作:
ls -lrtd -- *day* *night*
Run Code Online (Sandbox Code Playgroud)
在 zsh 中,如果没有day或没有night文件,则最后两个命令将失败;设置nonomatch或csh_null_glob选项,或(N)在每个模式后添加以避免这种情况。
Mat*_*teo 15
Shell 不使用正则表达式进行参数扩展。
您可以通过以下方式启用扩展模式匹配
$ shopt -s extglob
Run Code Online (Sandbox Code Playgroud)
进而
$ ls @(day|night).txt
day.txt night.txt
Run Code Online (Sandbox Code Playgroud)
例如参见Bash 参考手册(模式匹配)