我的目录如下所示:
$ ls
total 0
-rw-r--r-- 1 user user 0 Jun 18 22:44 file0
-rw-r--r-- 1 user user 0 Jun 18 22:44 file1
-rw-r--r-- 1 user user 0 Jun 18 22:44 file2
-rw-r--r-- 1 user user 0 Jun 18 22:44 file3
-rw-r--r-- 1 user user 0 Jun 18 22:44 file4
-rw-r--r-- 1 user user 0 Jun 18 22:44 file5
-rw-r--r-- 1 user user 0 Jun 18 22:44 file6
-rw-r--r-- 1 user user 0 Jun 18 22:44 file7
-rw-r--r-- 1 user user 0 Jun 18 22:44 file8
-rw-r--r-- 1 user user 0 Jun 18 22:44 file9使用bash,我想将file2与file6相匹配,不包括file3。
由于找不到匹配多个模式的and操作符,所以我认为我只是使用了DeMorgan的定律,即a AND b等价于!(!a OR !b)并编写
!(!(file[2-6])|file3)如预期的那样工作:
$ echo !(!(file[2-6])|file3)
file2 file4 file5 file6是否有更简单、更直接的方法来实现这一目标?
发布于 2022-06-18 21:38:44
您可以应用两个范围[24-6],其中2是第一个,4-6是第二个:
$ ls file[24-6]
file2 file4 file5 file6另一个例子是:
$ ls file[2356]
file2 file3 file5 file6范围有一个特殊的约定:用'-‘分隔的两个字符表示范围。(因此,"“相当于”“。)可以在字面意思中包括“-”,使其成为括号之间的第一个或最后一个字符。(因此,"[]-]“只匹配两个字符‘]和'-',以及"”匹配这三个字符’‘,'.','0',因为'/’不能匹配。)
发布于 2022-06-18 23:12:42
否定范围:
printf '%s\n' file[!013789]如前所述:
如果“(”)后面的第一个字符是“!”或者是“^”,那么任何没有括起来的字符都是匹配的。
将GLOBIGNORE设置为要跳过的文件:
GLOBIGNORE="file0:file1:file3:file7:file8:file9"
printf '%s\n' file*看看这个:
GLOBIGNORE变量可用于限制匹配模式的文件名集。如果设置了GLOBIGNORE,则从匹配列表中删除与GLOBIGNORE中的模式之一匹配的每个文件名。
使用extended globbing:
shopt -s extglob
printf '%s\n' file!([013789])https://unix.stackexchange.com/questions/706682
复制相似问题