使用通配符删除以多位数字为后缀的相似命名文件

使用通配符删除以多位数字为后缀的相似命名文件

我有许多名称相似且后缀为 1 到 500 的文件。我只想删除 1 到 250 个文件。有没有办法使用通配符来做到这一点。

文件是:stdout.1 到 stdout.500

我想删除从 stdout.1 到 stdout.250 的文件。

谢谢

答案1

在 Zsh 中,你可以只做rm stdout.<1-250>.<n-m>匹配文件名中表示十进制整数的部分n。 (可能有前导零,所以stdout.0099也会匹配。)

在 Bash 中,您可以使用大括号扩展:rm stdout.{1..250}。尽管与 Zsh 的区别<1-250>在于大括号扩展生成字符串而不考虑现有文件,因此如果列表中间缺少文件,您可能会收到错误。在 的情况下rm,添加该-f选项将消除这些错误,与 一样-frm只有当您要求它取消链接的任何文件在返回后仍然存在时才会抱怨。

如果您想避免生成不存在的文件的名称,或者仅限于标准sh(即没有大括号扩展),那么您必须逐个字符进行匹配。所以:

rm stdout.? stdout.??       #   1 to  99
rm stdout.1??               # 100 to 199
rm stdout.2[01234]?         # 200 to 249
rm stdout.250               # 250

但请注意,如果没有匹配的文件rm stdout.2[01234]?,则最终会删除调用的文件(stdout.2[1234]?如果存在)。

答案2

您可以使用大括号扩展为了这

rm stdout.{1..500}

该命令将扩展为rm stdout.1 stdout.2 ... stdout.500.如果某些文件不存在,您将收到一条错误消息,但您可以放心地忽略它。或者,您可以重定向 stderr,这样您就看不到它:

rm stdout.{1..500} 2>/dev/null

或者,但这会慢得多,您可以循环遍历文件并rm在仅存在的文件上运行:

for f in stdout.{1..500}; do
    [ -e "$f" ] && rm "$f"
done

您还可以删除名称以stdout.一个或多个数字开头和结尾的所有文件:

rm stdout.[0-9]*

但这仅在您没有与要保留的模式匹配的文件时才有效,因为它会删除全部文件显示名称开头为stdout.后跟任意数字,因此它也会删除stdout.501不属于您的范围的文件。

相关内容