我有一个目录,里面有几十万个文件。
我想删除所有文件,但 rm * -f 报告:“参数列表太长”
清除该目录的最佳方法是什么?
答案1
如果您无法删除该目录,您可以随时使用 find。
find . -maxdepth 1 -type f -exec rm -f {} \;
这将删除当前目录中的所有文件,并且仅删除当前目录(而不是子目录)。
答案2
查找 . -maxdepth 1 -type f -exec rm -f {} \;
它只是花费太长时间(每个文件执行一次 rm )。
这个效率更高:
查找 . -maxdepth 1 -type f -print0 | xargs -r0 rm -f
因为它尽可能多地将文件名作为 rm 的参数,然后使用下一批文件名运行 rm......可能 rm 只被调用 2 或 3 次。
答案3
这两种方法都可以解决这个问题。下面对每种技术在这里。
find . -name WHATEVER -exec rm -rf {} \;
或者
ls WHATEVER | xargs rm -rf
问题源于 bash 使用目录中的每个项目扩展“*”。这两种解决方案都是依次处理每个文件。
答案4
所有这些 find 调用都非常好,但是当我匆忙时,我很少记得确切需要的命名法:相反,我使用 ls。正如有人提到的,ls . 可以工作,但我更喜欢 ls -1,如下所示:
ls -1 | xargs -n 100 rm -rf
使用 -n xxx 数字是相当安全的,因为超过最大值要么会被自动更正(如果超过 size-max;参见 -s ),要么如果超出应用程序的 args-max,它通常会相当明显。
值得注意的是,当您只想删除大目录中的文件子集,而又不想因为某种原因使用 find 时,grep 可以方便地插入到此链的中间。
该答案假设您正在使用 Gnu 核心实用程序来执行 ls、xargs 等。