我有以下目录列表:
0 -rw-r--r-- 1 root root 0 Sep 2 15:19 aws.greengrass.LambdaLauncher.log
0 -rw-r--r-- 1 root root 0 Sep 2 15:19 aws.greengrass.LambdaRuntimes.log
0 -rw-r--r-- 1 root root 0 Sep 2 14:53 aws.greengrass.Nucleus.log
80 -rw-r--r-- 1 root root 75017 Sep 2 15:55 greengrass_2022_09_02_15_0.log
40 -rw-r--r-- 1 root root 36930 Sep 2 16:50 greengrass_2022_09_02_16_0.log
216 -rw-r--r-- 1 root root 217065 Sep 2 20:40 greengrass_2022_09_02_20_0.log
96 -rw-r--r-- 1 root root 92764 Sep 2 21:54 greengrass_2022_09_02_21_0.log
64 -rw-r--r-- 1 root root 58307 Sep 2 22:57 greengrass_2022_09_02_22_0.log
48 -rw-r--r-- 1 root root 46475 Sep 6 14:37 greengrass_2022_09_06_14_0.log
16 -rw-r--r-- 1 root root 14845 Sep 6 17:57 greengrass_2022_09_06_17_0.log
40 -rw-r--r-- 1 root root 39037 Sep 6 18:11 greengrass_2022_09_06_18_0.log
184 -rw-r--r-- 1 root root 186318 Sep 6 19:48 greengrass_2022_09_06_19_0.log
12 -rw-r--r-- 1 root root 10793 Sep 6 20:25 greengrass_2022_09_06_20_0.log
124 -rw-r--r-- 1 root root 122363 Sep 6 21:43 greengrass.log
我想删除名称以 greengrass 开头的任何文件。我已经尝试过这些通配符命令,但它们都不起作用:
sudo rm /greengrass/v2/logs/greengrass*.*
sudo rm /greengrass/v2/logs/greengrass*
sudo rm /greengrass/v2/logs/greengrass*.log
我得到:
rm: cannot remove '/greengrass/v2/logs/greengrass*.*': No such file or directory
答案1
正在发生的一切都与全球扩张有关。
当你跑步时:
sudo rm dir/*
运行 sudo 的 shell 尝试扩展“*”通配符。如果无法读取目录,则会将通配符按原样传递给 sudo。
sudo 执行rm
withdir/*
并且 rm 不执行全局扩展,只有 shell 执行。 rm 正在寻找一个名为 的文件*
,该文件是合法(但不寻常)的文件名。
如果运行 sudo 的用户可以读取该目录,则 acutall sudo 命令将为:
sudo rm dir/filea dir/fileb dir/filec
这会起作用的。由于您希望 root 进行全局扩展,因此您需要使用 shell,如下所示
sudo sh -c "rm dir/*"
然后 sudo 将以 root 身份运行 shell,这将运行命令“rm dir/*”,因为 shell 知道如何扩展 glob,那么它将变成“rm dir/filea dir/fileb ...”
答案2
您的普通用户可以读取目录 /greengrass/v2/logs 吗?如果没有,它会这样做,因为 shell 需要将通配符扩展为匹配文件列表(在将其传递给 之前sudo
,后者将其传递给rm
),并且如果 shell 无法列出目录的内容...那不会发生。
最简单的解决方案可能是sudo -s
打开根 shell,然后rm /greengrass/v2/logs/greengrass*.*
从该根 shell 运行。然后使用exit
或 Control-D 退出 root shell 并恢复正常。