正确的UNIX系统通配符表示法?

时间:2014-01-17 21:01:23

标签: unix wildcard sysadmin

我目前正在尝试从根目录中删除大量文件。大约有110个文件几乎完全相同的文件名。

文件名显示为wp-cron.php?doing_wp_cron=1.93,其中93是1-110中的任何整数。

但是,当我尝试运行代码:sudo rm /root/wp-cron.php?doing_wp_cron=1.*时,它实际上会尝试在文件名中找到带有星号*的文件,这样我就会发现找不到文件错误。

使用通配符表示法删除一系列文件的正确表示法是什么?

注意:我已尝试使用单个'和双引号"分隔文件路径。这没用。

对此事的任何想法?

2 个答案:

答案 0 :(得分:3)

使用ls -ld /root查看/ root目录上的权限,通常非root用户不具有r-x权限,这将不允许他们读取目录列表。

在命令sudo rm /root/wp-cron.php?doing_wp_cron=1.*中,文件名扩展尝试发生在非root用户下运行的shell中。由于您没有读取/ root权限,因此无法扩展到单个文件名。

然后shell执行sudo\0rm\0/root/wp-cron.php?doing_wp_cron=1.*\0。 (三个独立的,明确的论点)。

sudo,在满足条件后,执行rm\0/root/wp-cron.php?doing_wp_cron=1.*\0

rm会运行并尝试取消链接文字路径/root/wp-cron.php?doing_wp_cron=1.*,但就像您看到的那样失败。

删除解决方案取决于您的sudo权限。如果允许,您可以运行bash子流程以root身份执行文件名扩展:

sudo bash -c "rm /root/a*"

如果不允许,请使用显式文件名执行sudo rm。

答案 1 :(得分:0)

布兰登,

我同意@arkascha。那个glob应该匹配,所以这里有些不对劲。如果你使用不同的二进制文件,比如'ls',你会获得适当的文件列表吗?试试这个:

ls /root/wp-cron.php?doing_wp_cron=1.*

如果返回完整的文件列表,那么你知道你的环境对于rm有一些有趣的东西。这可能是建议的别名。

如果您无法确定您的环境有什么不同或错误,您可以通过for循环运行文件列表并删除每个文件作为解决办法:

for file in `ls /root/wp-cron.php?doing_wp_cron=1.*`
do
rm $file
done