我在Linux shell脚本中遇到了一个非常愚蠢的问题.我想删除目录中所有扩展名为".bz2"的文件.在 playbook 中我称之为

rm "$archivedir/*.bz2"

其中$archivedir是一个目录路径.应该很简单,不是吗?不知怎的,它成功地失败了,出现了以下错误:

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

但目录中有一个名为test的文件.如果我把脚本改成

echo rm "$archivedir/*.bz2"

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

推荐答案

TL;DR

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

rm "$archivedir"/*.bz2

Explanation

  • 在Unix中,程序通常不会自行解释通配符.shell解释不带引号的通配符,并用匹配文件名列表替换每个通配符参数.

  • 可以通过引用通配符、使用双引号或单引号,或在通配符前面加反斜杠来禁用此过程.然而,这并不是您想要的——您确实希望将通配符扩展到匹配的文件列表中.

  • rm $archivedir/*.bz2(不加引号)时要小心.单词拆分(即,将命令行拆分为参数)被替换为$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

Linux相关问答推荐

无法下载Centos 7上的存储库的元数据

用户作用域在Linux内核密钥环(Golang)中是什么意思?

Azure Linux B1s VM-Jenkins Sever已安装,但主页未打开

删除 csv 列中的不匹配值

在 linux 中插入带有 sed 命令的文件的行

提交SLURM作业(job)时出现nohup问题

查找更高版本的文件

我可以阅读 Linux 内核的哪些部分以获得乐趣?

nohup 是否可以跨管道工作?

关于 putenv() 和 setenv() 的问题

diff 命令仅获取不同行的数量

在 bash 中检测公共 IP 地址的方法

用于 Linux 的 Less 编译器

如何在 Linux 中查找所有以 .rb 结尾的文件?

如何下载较旧的 google play 服务?

在亚马逊 ec2 linux 微型实例上的 virtualenv 中安装 scipy 时遇到问题

判断 VT-x 是否已激活而无需在 Linux 中重新启动?

比较文件的日期 bash

Linux控制台中的模糊文件搜索

如何拖尾除第一行以外的所有行