什么时候通配符应该在双引号内/外?

时间:2016-07-26 20:39:13

标签: bash wildcard rm

使用通配符和变量删除多个文件的正确方法是什么?这是我的变量"$dir"

$ echo "$dir"
/home/path/to/file

这里我在双引号内有外卡,但它不起作用:

$ rm "$dir/data/ffg_per_product/ffg*"
rm: cannot remove `/home/path/to/file/data/ffg_per_product/ffg*': No such file or directory

这里我在双引号之外有通配符,它​​可以工作:

$ rm "$dir/data/ffg_per_product/ffg"*

在这里你可以看到文件被删除了:

$ ls -lth ffg_per_product/ffg* | wc -l
ls: cannot access ffg_per_product/ffg*: No such file or directory
0

所以我想知道的是,我是否正确使用引号来删除带有通配符的文件rm "$dir/data/ffg_per_product/ffg"*?或者还有其他/更好的方法吗?

注意:可能对某些人来说很明显,但仅仅是为了引用而且要明确,同样适用于ls,例如ls "$dir/data/ffg_per_product/NAME"* | wc -l,其中,外卡必须在双引号之外。

1 个答案:

答案 0 :(得分:3)

引号之外的login由shell扩展为匹配的文件名。

内部引号*未展开,按字面意思使用,只是一个简单的*

这是正确的,符合您的意图:

*

使用rm "$dir/data/ffg_per_product/ffg"* 命令的另一个示例也是如此, 完全相同的推理。