为什么通配符在 `sudo rm` 语句中不起作用?

why wildcard doesn't work in `sudo rm` statement?

我试图删除日志目录中的所有文件并在 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 配置?

通配符扩展由 shell 完成,而不是由 rm 完成。

并且 shell 没有 sudo 权限,只有 rm 有。

所以由于shell没有读取/var/log/jenkins的权限,所以没有扩展,rm试图删除文件(不是通配符)/var/log/jenkins/* -- 不存在。

要解决这个问题,您需要一个 shellsudo 权限执行您的 rm:

sudo sh -c 'rm /var/log/jenkins/*'

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