这是我当前的目录,其中包含以下文件夹:
rpea-vd1-430: ls
rev10 rev11 rev12 rev2 rev3 rev4 rev5 rev6 rev7 rev8 rev9 Synthesis.config Synthesis.html
我使用了以下 linux 命令来删除文件夹。
rm -rf rev[1-11]
但如果我给出,我的命令就会失败
rm -rf rev[1-9]
因为它删除了从 rev1 到 rev9 命名的目录;为什么不考虑两位数?
预期输出:
rev11 Synthesis.config Synthesis.html
答案1
大括号扩展不是数值的。
rev[1-9]
[1-9]
将与所有人一起扩展特点1 到 9 之间rev[2468]
将扩展到rev2 rev4 rev6 rev8
rev[A-Z]
将扩展为revA revB ... revZ
(假设文件存在)rev[1-11]
同样会扩展到 1 到 1 之间的所有字符rev[1-15]
将扩展到 1 和 1 之间的所有字符以及字符 5,因此相当于rev[15]
, 匹配rev1
和rev5
答案2
为什么
rm -rf rev[1-9]
不考虑两位数?
为什么应该这样?您只指定了一位数字。括号表达式[..]
精确匹配一个字符,该字符必须是括号内列出的字符之一。因此rev[1-9]
匹配格式为 的文件名revN
,其中N
是一些数字(除了0
)。同样,rev[1-11]
完全匹配rev1
,因为1
它是括号内指定的唯一字符,即使它被指定了多次。它与rev[1]
或相同rev1
。同样,rev[1-12]
将与 相同rev[12]
。
您可以用来rev[0-9]*
匹配所有以rev
、数字开头,然后是任何内容的文件名,或者使用扩展的全局在 Bash 和 ksh 中,rev+([0-9])
.子表达式+(...)
至少与括号内的模式重复匹配一次,与(...)+
正则表达式类似。
{a..b}
另一方面,大括号扩展会生成字符串,而不是匹配文件名,因此您可以使用rev{1..12}
生成rev1
, rev2
, ... rev12
。这不会考虑文件是否存在,因此它也会生成rev1
,这在您的示例中不存在。
从编辑来看,您想要匹配(和rm
)所有匹配 的文件rev*
,除了rev11
?最简单的方法可能是暂时重命名异常(假设arev11
不存在):
$ mv rev11 arev11
$ rm -r rev*
$ mv arev11 rev11
您可以使用大括号扩展...
$ rm -r rev{{1..10},12}
(如果您将上限设置得太高,则会出现有关不存在名称的错误。)
创建一个匹配 11 以外的数字的 glob 有点棘手,可能是这样的,但最好先仔细检查一下:
$ echo rm -r rev[0-9] rev1[02-9] rev[2-9][0-9]
答案3
您必须使用大括号和..
:
rm -rf rev{1..11}
echo rev[1-11]
查看和 之间的区别 echo rev{1..11}
。