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

问题描述 投票:0回答:2

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

bash shell wildcard sudo
2个回答
29
投票

通配符扩展由 shell 在实际调用

sudo
之前完成。而shell本身没有(或获取)
sudo
权限,因此无法读取
/var/log/jenkins/
的内容。

rm
(现在被赋予了 sudo 权限)看到它的参数时,通配符扩展已经发生了——或者更确切地说,它还没有发生,因为没有任何东西(可以由 shell 读取)与
*
相匹配。

因此

rm
尝试删除 文件(不是通配符)
/var/log/jenkins/*
——它不存在:

rm:无法删除`/var/log/jenkins/*':没有这样的文件或目录

要解决这个问题,您需要一个具有 sudo 权限的

shell
来执行您的
rm
:

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

现在 shell 本身得到

sudo
ed,并且可以在调用
rm
之前进行扩展。


0
投票

目录

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

© www.soinside.com 2019 - 2024. All rights reserved.