bash处理文件名

时间:2017-12-05 20:05:42

标签: linux bash shell escaping quotation-marks

我正在尝试删除并替换文件名中存在的引号。例如,我想改变:

$ ls
abc"def"ghi"jkl"mno

到这个

$ ls
abc:def:ghi:jkl:mno

在尝试解决这个问题时,我遇到了How to rename a bunch of files to eliminate quote marks,这正是我想要做的。但是,它对我的​​情况不起作用。为了找出原因,我尝试创建一个这样的测试文件:

$ touch abba\"abba\"cde\"cde\"efef

使用此文件,我遇到的解决方案(如上所述)有效。但为什么它不适用于第一个文件?

我发现的一件事是bash命令完成后会看到不同的东西。如果我输入

$ ls abb<tab>

bash将完成文件名,如下所示:

$ abba\"abba\"cde\"cde\"efef
就像我创造它一样。但对于原始文件,bash完成是这样的:

$ ls abc<tab>

结果

$ abc"def"ghi"jkl"mno

因此在测试用例文件中,有一个引号的转义,而在另一种情况下(我真的想要重命名的文件),没有转义引号。我不知道原始文件是如何命名的。

任何人都可以解释为什么bash会以不同的方式看到这些名称,以及如何重命名我的文件?

1 个答案:

答案 0 :(得分:0)

以下是使用"(quotation)标记

重命名文件的两种方法

选项1:使用转义字符\

mv abc\"cdf\"efg\"hij newFileName

选项2 :使用'(single quote)

mv 'abc"cdf"efg"hij' newFileName

注意:在文件名中使用:(colon)之类的特殊字符可能不是一个好主意,

并且关于自动完成,它通常用转义字符填充名称,例如

ls abc<tab> 会将名称改为 ls abc\"cdf\"efg\"hij

除非您使用引号启动名称,例如

ls 'abc<tab> 会将名称改为 ls 'abc"cdf"efg"hij'