文件名替换——有什么可以确保它不是某些字母吗?

文件名替换——有什么可以确保它不是某些字母吗?

获取包含除少数字符之外的任何字符的文件名的命令是什么?

假设我不希望文件名包含字母 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 extglobhelp shopt在 bash 提示符下输入以获取更多信息。

答案3

为什么不简单地

ls | grep -v [qQ]

如果您想要排除包含特定字符的文件名,而不是单个字符字符串你可以这样做

ls | grep -v "str1\|str2\|..."

即使用转义的竖线字符|(充当“OR”逻辑运算符)分隔任何字符串。请记住将其括在双引号中,以防止误解特殊字符。

相关内容