gpt4 book ai didi

linux - rm 无法通过通配符从脚本中删除文件,但可以在 shell 提示符下工作

转载 作者:IT老高 更新时间:2023-10-28 12:33:12 26 4
gpt4 key购买 nike

我在使用 Linux shell 脚本时遇到了一个非常愚蠢的问题。我想删除目录中所有扩展名为“.bz2”的文件。在我调用的脚本中

rm "$archivedir/*.bz2"

其中 $archivedir 是目录路径。应该很简单,不是吗?不知何故,它设法失败并出现此错误:

rm: cannot remove `/var/archives/monthly/April/*.bz2': No such file or directory

但是 目录中有一个名为 test.bz2 的文件,如果我将脚本更改为

echo rm "$archivedir/*.bz2"

并将该行的输出复制/粘贴到终端窗口中,文件已成功删除。我做错了什么?

最佳答案

TL;DR

只引用变量,而不是用通配符引用整个预期路径

rm "$archivedir"/*.bz2

说明

  • 在 Unix 中,程序本身通常不会解释通配符。 shell 解释不带引号的通配符,并用匹配的文件名列表替换每个通配符参数。如果 $archivedir 可能包含空格,那么 rm $archivedir/*.bz2 可能不会像你那样做

  • 您可以通过引用通配符、使用双引号或单引号或在它之前的反斜杠来禁用此过程。但是,这不是您想要的 - 您确实希望通配符扩展到它匹配的文件列表。

  • 小心编写 rm $archivedir/*.bz2(不带引号)。单词拆分(即,将命令行分解为参数)发生在 $archivedir 被替换之后。因此,如果 $archivedir 包含空格,那么你会得到你不想要的额外参数。假设 archivedir 是 /var/archives/monthly/April to June。然后你会得到相当于写 rm/var/archives/monthly/April 到 June/*.bz2,它试图删除文件 "/var/archives/monthly/April", "to”,以及所有匹配“June/*.bz2”的文件,这不是你想要的。

正确的解法是这样写:

rm "$archivedir"/*.bz2

关于linux - rm 无法通过通配符从脚本中删除文件,但可以在 shell 提示符下工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/790195/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com