假设我有一个文件夹,/var/log/nginx
该文件夹受保护(由 root 拥有,其他人都无法读取或写入)。即使使用 sudo,我也无法避免sudo rm -f /var/log/nginx/ab*
出现“没有这样的文件或目录”。我是否必须实际加载 root shell 才能执行此操作,还是有其他方法?
答案1
原因
shell 会解释并扩展任何 glob 字符(通配符),例如星号。命令的解释发生在当前 shell 中(在sudo
执行命令之前),当前 shell 没有目录的读取权限。由于当前 shell 找不到与 glob 模式匹配的文件,因此不会执行路径名扩展,shell 将rm
、-f
和/var/log/nginx/ab*
(带有文字星号)作为参数传递给sudo
命令。
该sudo
命令反过来启动rm
尝试删除路径为/var/log/nginx/ab*
(星号是 Unix 文件名的合法字符)的文件的命令。由于这样的文件实际上不存在,因此它会报告失败。对于 GNU 来说rm
,这个错误消息是明确的;满的以下错误消息表明被删除的(单个)文件不存在:
rm: cannot remove `/var/log/nginx/ab*': No such file or directory
解决方案
解决方案是以具有执行文件名扩展所需权限的超级用户身份启动新 shell:
sudo bash -c "rm -f /var/log/nginx/ab*"
上述命令启动一个以 root 身份运行的新 shell,选项-c
用于传递要由 shell 运行的命令。由于命令被引用,星号不会被当前 shell 解释,而是按原样传递给新的 root shell,允许它在启动命令之前扩展路径名rm
。
答案2
您的文件名可能有问题,或者文件名中可能有空格。
因此,请尝试以下解决方法:
尝试使用 prefix
--
来表示选项的结束,例如:sudo rm -vf -- /var/log/nginx/ab*
使用
find
:sudo find /var/log/nginx -name "ab*" -print -delete
如果您认为您的文件在 Linux 上受到保护,请先尝试删除保护:
chattr -i ab*