我在 Linux shell 脚本中遇到了一个非常愚蠢的问题。我想删除目录中扩展名为“.bz2”的所有文件。在我调用的脚本中
rm "$archivedir/*.bz2"
其中 $archivedir 是目录路径。应该很简单,不是吗?不知何故,它因以下错误而失败:
rm: cannot remove `/var/archives/monthly/April/*.bz2': No such file or directory
但有is该目录中的一个名为 test.bz2 的文件,如果我将脚本更改为
echo rm "$archivedir/*.bz2"
并将该行的输出复制/粘贴到终端窗口中,文件已成功删除。我究竟做错了什么?
TL;DR
仅引用变量,而不是带有通配符的整个预期路径
rm "$archivedir"/*.bz2
解释
在 Unix 中,程序本身通常不解释通配符。 shell 解释不带引号的通配符,并将每个通配符参数替换为匹配文件名的列表。
如果 $archivedir 可能包含空格,那么rm $archivedir/*.bz2
可能不会做你想做的事
您可以通过引用通配符、在其前面使用双引号或单引号或反斜杠来禁用此过程。但是,这不是您想要的 - 您确实希望将通配符扩展到它匹配的文件列表。
写字要小心rm $archivedir/*.bz2
(不带引号)。发生分词(即将命令行分解为参数)after$archivedir 被替换。因此,如果 $archivedir 包含空格,那么您将得到您不想要的额外参数。说 archivedir 是/var/archives/monthly/April to June
。然后你会得到相当于写作的东西rm /var/archives/monthly/April to June/*.bz2
,它尝试删除文件“/var/archives/monthly/April”、“to”以及所有与“June/*.bz2”匹配的文件,这不是您想要的。
正确的解决方案是这样写:
rm "$archivedir"/*.bz2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)