我正在尝试运行:
for i in *; do sudo rm $i; done
问题是 glob 扩展有问题,我收到错误:
rm: cannot remove '*': No such file or directory
每次循环运行时都会出现此错误。文件被删除(尽管我使用 CTRL+C 来停止错误)但我收到了这个我不应该收到的错误,因为我没有转义 glob 符号并且没有使用任何单引号。
过去这种方法一直有效,没有出现错误。
另外,如果我运行:
sudo rm 1*
例如,它将正确运行使用 glob。但是,如果我运行:
for i in 1 2 3 4 5 6 7 8 9; do sudo rm $i*; done
我得到以下信息:
rm: cannot remove '1*': No such file or directory
rm: cannot remove '2*': No such file or directory
rm: cannot remove '3*': No such file or directory
rm: cannot remove '4*': No such file or directory
rm: cannot remove '5*': No such file or directory
rm: cannot remove '6*': No such file or directory
rm: cannot remove '7*': No such file or directory
rm: cannot remove '8*': No such file or directory
rm: cannot remove '9*': No such file or directory
我的循环中的 glob 现在有什么问题?
我对删除文件的不同方法不感兴趣。我只对 glob 扩展有什么问题感兴趣。glob 扩展似乎有效(所有文件都被删除),但随后它会再次循环,就像我转义了 glob 字符而不是完成一样。
编辑:
似乎只有文件数量过多时才会出现此问题。我for i in *; do sudo rm $i; done
在只有 800 个文件的同一目录上运行了命令:,但无法重现该错误。
我也测试了该命令:for i in 1 2 3 4 5 6 7 8 9; do sudo rm $i*; done
并且当仅删除~800 个文件和一些编号的虚拟文件时没有出现错误。
答案1
“一个命令中要删除的文件太多rm
。”——这个问题有一个众所周知的解决方案——使用find
和xargs
。它们一起处理“文件太多”以及“带有奇怪字符的文件”。阅读man find
和man xargs
。
您的特定情况“ for i in *; do sudo rm $i; done
”将表示为
find . -maxdepth 0 -type f -print0 |\
xargs -0 --no-run-if-empty sudo rm
将运行尽可能少的sudo rm
命令,在一行中填充尽可能多的文件名(参见xargs --show-limits </dev/null
)。
或者,
sudo find . -maxdepth 0 -type f -delete
但口味各有不同。
答案2
如果您需要sudo
删除此目录中的任何内容,那么您肯定也没有读取权限,这会阻止bash
执行 glob 扩展 - 请改为在 root shell 中运行循环:
sudo bash -c 'for i in *; do rm "$i"; done'