Linux 文件名中引号的bash处理

Linux 文件名中引号的bash处理,linux,bash,shell,escaping,quotation-marks,Linux,Bash,Shell,Escaping,Quotation Marks,我试图删除并替换文件名中的引号。例如,我想更改: $ ls abc"def"ghi"jkl"mno 对此 $ ls abc:def:ghi:jkl:mno 在试图解决这个问题的过程中,我发现,这正是我想要做的。然而,这对我的案子不起作用。为了找出原因,我尝试创建如下测试文件: $ touch abba\"abba\"cde\"cde\"efef $ ls abc<tab> 有了这个文件,我遇到的解决方案(如上面提到的)就起作用了。但是为什么第一个文件不起作用呢 我发现,bas

我试图删除并替换文件名中的引号。例如,我想更改:

$ ls
abc"def"ghi"jkl"mno
对此

$ ls
abc:def:ghi:jkl:mno
在试图解决这个问题的过程中,我发现,这正是我想要做的。然而,这对我的案子不起作用。为了找出原因,我尝试创建如下测试文件:

$ touch abba\"abba\"cde\"cde\"efef
$ ls abc<tab>
有了这个文件,我遇到的解决方案(如上面提到的)就起作用了。但是为什么第一个文件不起作用呢

我发现,bash命令完成对它们的看法不同。如果我输入

$ ls abb<tab>
就像我创造的一样。但对于原始文件,bash完成如下所示:

$ touch abba\"abba\"cde\"cde\"efef
$ ls abc<tab>
所以在测试用例文件中,有引号的转义,而在另一种情况下(我真的想重命名的文件),并没有引号的转义。我不知道原始文件是如何命名的


有人能解释为什么bash对这些名称的看法不同,以及我将如何重命名我的文件吗?

这里有两种方法可以使用
(引号)
标记重命名文件

选项1:带转义字符
\

mv abc\"cdf\"efg\"hij newFileName
选项2:使用
”(单引号)

注意:在文件名中使用特殊字符,如
:(冒号)
,可能不是一个好主意


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

ls-abc
将完成
ls-abc\'cdf\'efg\'hij

除非名称以引号开头,例如


ls'abc
将完成ls'abc“cdf”efg“hij”的名称
mv'abc“def”ghi“jkl“mno”“abc:def:ghi:jkl:mno'
?完成方式的差异可能与以下事实有关:
ls abb
正在完成
ls
命令的参数,而
abc
正在使用默认完成方式(与任何特定命令无关)完成命令。您确定这些是常规ASCII引号,而不是花哨的unicode引号?它们看起来非常相似,但shell处理它们的方式有很大的不同。
printf“%q\n”*
在文件所在的目录中,将以明确的形式显示每个文件名。如果这是关于制表符完成(一种严格的交互工具)的问题,而不是关于软件开发的问题,那么就有了。谢谢Jithin。我开始评论它不起作用,但我一定是打错了。当我自动完成时,选项2起作用。非常感谢。@ChrisF-该解决方案(自动完成)对1个或2个文件交互是可行的,它并不是对您最初问题的真正答案。
mv 'abc"cdf"efg"hij' newFileName