我有一个 shell 脚本,需要删除目录中以数字开头的所有文件。该文件集已发展到包含每天需要删除的数十万个文件。该脚本包含以下几行:
rm -f /my/dir/11*
rm -f /my/dir/12*
(( etc ))
rm -f /my/dir/1*
rm -f /my/dir/2*
我收到每一行的错误消息
line 1: /usr/bin/rm: Argument list too long
我尝试用以下内容替换这些行
ls -d /my/dir/11* | xargs rm
但ls -d
给了我同样的错误消息。
如何删除这些文件而不增加列表以包含数百个文件名排列?
答案1
如果您想获取相对路径并将其传递到rm
,您可以使用以下find
命令,对于您的用例,我将运行:
find /my/dir -iname '[0-9]*' -type f
这将返回以数字开头的每个文件。如果您要删除该列表,请find
使用以下命令删除它们-delete
:
find /my/dir -iname '[0-9]*' -type f -delete
祝你好运!
答案2
如果您的 shell 有内置printf
命令(例如 Bash 或 Dash),它可能接受更长的参数列表,您可以通过管道传输到xargs
:
printf '%s\0' /path/to/glob* | xargs -0 rm -f