如何使用命令行删除以数字作为文件名的目录?

如何使用命令行删除以数字作为文件名的目录?

我有一个目录,其中有子目录,其中子目录以数字作为目录。例如,我有一个父目录,test现在我有一些子目录,例如1, 2, 3, 4, 5, 6, 7

现在我有一个本地导出变量,例如export a=3.我想删除高于或等于$a但低于或等于的目录,$a+2所以我想删除目录3,,45

另外,如果我不知道最小目录数,并且我想删除低于或等于$a目录数的所有内容1,则目录 , 2,3被删除。我怎样才能实现这个目标?

我尝试过,rm -rf {$a..$($a+3)}rm -rf {<$a}没有成功,我尝试了很多其他的事情,但没有成功。

答案1

您可以使用 zsh 而不是 bash,它具有 glob 运算符来匹配十进制整数范围,并且还可以将 glob 限制为给定类型的文件(例如目录在你的情况下)。

glob<3-5>匹配组成数字 3 到 5 的字符串,其中包括 3、4 和 5,还包括03, 003。但数字必须是字面意思。如果您执行以下操作,您仍然可以使用变量:

range="<$a-$((a+2))>"
rm -rf test/$~range(/)

where$~range强制参数扩展被视为一种模式,并(/)限制为文件类型目录

如果使用匿名函数,则可以不使用中间变量:

() { rm -rf test/$~1(/); } "<$a-$((a+2))>"

要匹配小于 4 的数字,只需使用<0-3><-3>。还包括负数:(-<->|<0-3>).

您的{$a..$((a+2))}方法可以在 zsh 中工作,尽管它会扩展为3, 45无论该名称的文件是否存在(并且在 03, 00005... 上不匹配)。事实上,它不起作用是一个限制,仅影响 bash shell(在支持它的 shell 中,{x..y}它实际上是 zsh 的发明)。

答案2

假设只有以数字为名称的目录,那么我们可以使用:

rm -rf $(seq $(ls | head -1) $a)

相关内容