我有许多名称相似且后缀为 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
选项将消除这些错误,与 一样-f
,rm
只有当您要求它取消链接的任何文件在返回后仍然存在时才会抱怨。
如果您想避免生成不存在的文件的名称,或者仅限于标准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
不属于您的范围的文件。