我有一个目录,其中有子目录,其中子目录以数字作为目录。例如,我有一个父目录,test
现在我有一些子目录,例如1
, 2
, 3
, 4
, 5
, 6
, 7
。
现在我有一个本地导出变量,例如export a=3
.我想删除高于或等于$a
但低于或等于的目录,$a+2
所以我想删除目录3
,,4
。5
另外,如果我不知道最小目录数,并且我想删除低于或等于$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
, 4
,5
无论该名称的文件是否存在(并且在 03, 00005... 上不匹配)。事实上,它不起作用是一个限制,仅影响 bash shell(在支持它的 shell 中,{x..y}
它实际上是 zsh 的发明)。
答案2
假设只有以数字为名称的目录,那么我们可以使用:
rm -rf $(seq $(ls | head -1) $a)