为什么通配符在 `sudo rm` 命令中无法正常工作?

13

我试图在CentOS 6.5上使用默认的bash shell删除日志目录中的所有文件。

[lei@ids7gueywjZ /]$ sudo ls -al /var/log/jenkins/
total 1541512
drwxr-x---   2 jenkins jenkins       4096 Jul 22 09:52 .
drwxr-xr-x. 10 root    root          4096 Jul 14 21:27 ..
-rw-r--r--   1 jenkins jenkins      31483 Jul 22 17:07 jenkins.log
-rw-r--r--   1 jenkins jenkins 1073606656 Jul 18 03:16 jenkins.log-20150718
-rw-r--r--   1 jenkins jenkins  504815011 Jul 19 03:30 jenkins.log-20150719.gz
[lei@ids7gueywjZ /]$ sudo rm -r /var/log/jenkins/*
rm: cannot remove `/var/log/jenkins/*': No such file or directory

我不明白为什么 rm -r /var/log/jenkins/* 不起作用?是否有一些默认的shell配置我错过了?

2个回答

30
通配符扩展是由shell在实际调用sudo之前完成的。而shell本身没有(或者得不到)sudo权限,因此它无法读取/var/log/jenkins/目录的内容。
当具有sudo权限的rm命令看到它的参数时,通配符扩展已经发生了,或者更准确地说,它没有发生,因为没有任何(对shell可读)与*匹配的内容。
所以rm尝试删除文件(而不是通配符)/var/log/jenkins/*,但该文件不存在:
rm: 无法删除“/var/log/jenkins/*”:没有那个文件或目录
为了解决这个问题,您需要一个具有sudo权限的shell来执行您的rm命令。
sudo sh -c 'rm /var/log/jenkins/*'

现在shell本身被sudo,可以在调用rm之前进行扩展。

1
@LeoShi:这里的道德是,“仔细阅读错误信息,并且字面理解”。我承认一开始我也有点迷糊。;-) - DevSolar

0

目录/var/log/jenkins没有“其他人”的权限。 即使您运行 sudo rm -r /var/log/jenkins/*,shell扩展也是由您的用户完成的。 您应该删除整个目录(suro rm -r /var/log/jenkinks),或者以适当的用户身份执行所有操作(我建议使用jenkins用户执行su)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接