【问题标题】:bash handling of quotation marks in filenamebash 处理文件名中的引号
【发布时间】: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&lt;tab&gt; 正在完成 ls 命令的参数这一事实有关,而 abc&lt;tab&gt; 正在使用默认完成完成命令(与任何特定命令)。
  • 你确定这些是常规的 ASCII 引号,而不是花哨的 unicode 引号吗?它们看起来非常相似,但是 shell 处理它们的方式有很大不同。
  • printf '%q\n' * 在文件所在目录中将以明确的形式显示每个文件名。
  • 如果这是一个关于tab-completion(一个严格的交互工具)的问题,而不是关于软件开发的问题,这里有better placesfor it

标签: linux bash shell escaping quotation-marks


【解决方案1】:

这里有两种方法可以重命名带有"(quotation) 标记的文件,

选项1:带有转义字符\

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

选项2:使用'(single quote)

mv 'abc"cdf"efg"hij' newFileName

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


关于自动补全,通常用转义字符填充名称,例如

ls abc&lt;tab&gt; 会将姓名补全为 ls abc\"cdf\"efg\"hij

除非您以引号开头名称,否则示例

ls 'abc&lt;tab&gt; 将姓名补全为 ls 'abc"cdf"efg"hij'

【讨论】:

  • 谢谢吉廷。我开始评论说它不起作用,但我一定是打错了。当我进行自动完成时,选项 2 起作用。非常感谢。
  • @ChrisF - 该解决方案(自动完成)对于 1 或 2 个文件交互是可行的,它并不是您原来问题的真正答案。
猜你喜欢
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 2013-03-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多