全局扩展在循环中突然无法正常工作

全局扩展在循环中突然无法正常工作

我正在尝试运行:

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。”——这个问题有一个众所周知的解决方案——使用findxargs。它们一起处理“文件太多”以及“带有奇怪字符的文件”。阅读man findman 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'

相关内容