rm -rf 无法使用 Linux 处理数字?

rm -rf 无法使用 Linux 处理数字?

这是我当前的目录,其中包含以下文件夹:

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], 匹配rev1rev5

答案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}

相关内容