【发布时间】:2017-12-05 20:05:42
【问题描述】:
我正在尝试删除和替换文件名中存在的引号。比如我想改:
$ 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 对这些名称的看法不同,以及我将如何重命名我的文件?
【问题讨论】:
-
mv 'abc"def"ghi"jkl"mno' 'abc:def:ghi:jkl:mno'? -
完成的差异可能与
ls abb<tab>正在完成ls命令的参数这一事实有关,而abc<tab>正在使用默认完成完成命令(与任何特定命令)。 -
你确定这些是常规的 ASCII 引号,而不是花哨的 unicode 引号吗?它们看起来非常相似,但是 shell 处理它们的方式有很大不同。
-
printf '%q\n' *在文件所在目录中将以明确的形式显示每个文件名。 -
如果这是一个关于tab-completion(一个严格的交互工具)的问题,而不是关于软件开发的问题,这里有better placesfor it。
标签: linux bash shell escaping quotation-marks