在Bash中,我如何删除一系列数字范围内的目录?

3

我正在编写一个别名(alias),用于删除包含整数的一系列目录。然而,我无法想出如何替换数值,例如322和394,以便在输入命令时添加2个变量(参数)。

以下是当前状态的alias。

    alias rRange='ls -1 | awk -F'"'"'v'"'"' '"'"'{if ( ($2>=322) && ($2<=394) ) print "rm -fRv " $0 }'"'"''

但我希望您能够输入:
    rRange 322 394

目前这些值是硬编码在其中的,我希望你能够驾驶那个别名。

3个回答

7

逐步、自下而上地解决此类问题的分解方法:

要生成整数序列,请使用bash大括号扩展(详见man bash):

$ echo {2..5}
2 3 4 5

您也可以生成非连续和多个范围:
$ echo {2..4} {8..9}
2 3 4 8 9

如果您有变量而不是常量,可以使用eval来扩展它们:

$ a=2 b=5
$ eval echo {$a..$b}
2 3 4 5

要列出包含这些值的任何文件/目录,请用 * 括起来:

$ eval echo *{$a..$b}*

如果要删除文件而不是列出它们,请使用rm而不是echo

$ eval rm *{$a..$b}*

要删除目录,使用rm -r(如果目录非空)或rmdir(如果为空):
$ eval rm -r *{$a..$b}*
$ eval rmdir *{$a..$b}*

eval echo {$a..$b} 是非标准的。数字花括号扩展从未设计为具有定义范围(或增量)的变量。任何时候,如果您不得不在除算术或匹配表达式之外的其他内容上调用 eval,请仔细检查 bash 手册。 - David C. Rankin
感谢David的评论。bash执行7个扩展,大括号扩展是其中之一。eval添加了另一个shell级别。eval在echo之前发生恰好起作用,因为评估顺序是从左到右的,当遇到大括号扩展上的echo时,变量已经被扩展为常量。它可以工作,但我同意这是边缘可靠的领域。也许eval“echo {$a..$b}”会更清晰。当然,引号会破坏由星号包围的情况。 - arielf
你是100%正确的...我认为这正是花括号扩展内部变量不被支持的确切原因。由于花括号扩展首先发生,扩展无法知道值是什么。我知道那个强制它工作的技巧,但我只在Bash Hackers网站上看到过它的另一个用途,并警告说它不是标准的,如果你正在考虑使用它--可能有另一种支持的方法来完成你想要做的事情... - David C. Rankin

2

使用函数代替别名:

function rRange {
    for (( I = $1; I <=$2; ++I )); do
        [[ -d $I ]] && rm -fRv "$I"
    done
}

0

更多扩展。

rm ... *{322..394}*

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接