获取包含除少数字符之外的任何字符的文件名的命令是什么?
假设我不希望文件名包含字母 q 和 Q
ls[^qQ]不起作用。我该怎么办?
答案1
如果您想使用通配符(这并不总是一个好主意),您可以使用:
$ ls -d !(*[qQ]*)
或者shopt -s nocaseglob
:
$ shopt -s nocaseglob
$ ls -d !(*q*)
该-d
选项不列出匹配目录的内容。
为了使此功能有效,您必须进行extglob
设置,默认情况下可能就是这样。如果没有,shopt -s extglob
也可以。
更好的方法是使用寻找,因为如果你需要的话,你可以-exec
在匹配的文件上做一些事情(重命名,grep、编辑等),这样您就可以更好地控制需要匹配的内容。例如:
$ find . -maxdepth 1 \! -iname '*q*' -type f
这将查找-type f
当前目录 () 中所有.
不位于子目录 () 中且不-maxdepth 1
包含 ( \!
) 的文件 (问或问以他们的名义(-iname '*q*'
)。
如果你有大量文件,寻找比 更好更快猛击的通配符,并且不会溢出最大参数数量。
希望这可以帮助!
答案2
如果 bash扩展通配符启用后,您可以使用 !( 反转匹配图案)例如如果
$ touch aQq qwerty uiop asdfg bnmq
$
$ ls
aQq asdfg bnmq qwerty uiop
然后
$ ls !(*[qQ]*)
asdfg uiop
然而
$ ls *[qQ]*
aQq bnmq qwerty
您可以使用 检查 extglob 选项的当前值,shopt -p extglob
并使用 进行设置shopt -s extglob
。help shopt
在 bash 提示符下输入以获取更多信息。
答案3
为什么不简单地
ls | grep -v [qQ]
如果您想要排除包含特定字符的文件名,而不是单个字符字符串你可以这样做
ls | grep -v "str1\|str2\|..."
即使用转义的竖线字符|
(充当“OR”逻辑运算符)分隔任何字符串。请记住将其括在双引号中,以防止误解特殊字符。