文件名中包含 '(撇号)

文件名中包含 '(撇号)

当我列出名称中包含空格的文件时,大多数时候我会看到它们被撇号包围:

'famille, vacances, loisirs'

我必须编辑一个文件,其名称必须为 : Chapitre 2 : L'accès au système.md,其中包含撇号。


我试过 :

gvim 'Chapitre 2 : L''accès au système.md'

中间的撇号加倍。但它创建了一个文件'Chapitre 2 : Laccès au système.md',根本没有撇号。


我试过 :

gvim "Chapitre 2 : L'accès au système.md"

它创建了一个名为:"Chapitre 2 : L'accès au système.md"


我有两个问题:

  1. (对于系统而言)文件名:与我成功执行此操作时"Chapitre 2 : L'accès au système.md"命名的文件相同吗?'Chapitre 2 : L'accès au système.md'

  2. 我应该如何在我的文件中写入文件名格维姆'Chapitre 2 : L'accès au système.md'命令来获取我想在 a 的输出中读取的确切文件名LS命令 ?

答案1

您正在使用某些系统,其中ls使用 shell 的引用规则输出文件名,以使输出明确。可能例如 GNU lsQUOTING_STYLE设置为shell,或ls来自 coreutils >= 8.25,其中这是默认值。在命令行输入文件名时,shell 的引用规则也很重要。

gvim 'Chapitre 2 : L''accès au système.md'相反,创建了一个文件'Chapitre 2 : Laccès au système.md',根本没有撇号。

您为 shell 提供了两个背对背的单引号字符串,它们只是连接在一起。在 SQL 中,您可以通过这种方式获得单引号,但在最常见的 shell 中您不能(†)。您显示的外部单引号不应成为文件名的一部分,它们只是显示ls以使输出明确的内容。实际文件名是Chapitre 2 : Laccès au système.md.

(† POSIX 风格的 shell(例如具有默认设置的 Bash、ksh 和 zsh)、(t)csh 和 Fish 将其视为连接,这也是它在 Python 等中的工作方式。其他一些 shell (rc/es/akanga )执行 SQL 执行的操作,但 zsh 可以选择执行rcquotes此操作。)

gvim "Chapitre 2 : L'accès au système.md"创建了一个名为:"Chapitre 2 : L'accès au système.md"

它很可能创建了一个名为Chapitre 2 : L'accès au système.md.双引号不是名称的一部分,它们只是打印出来ls以使输出明确。这里使用双引号而不是单引号,因为名称有一个单引号,但双引号中没有什么特别的,所以这种格式是最干净的。尽管


  1. (对于系统而言)文件名 :是否与我成功执行此操作时"Chapitre 2 : L'accès au système.md"命名的文件相同?'Chapitre 2 : L'accès au système.md'

如果这些是完整的文件名——并且它们作为文件名是有效的! -- 那么不,它们不等价,因为另一个包含两个双引号和一个单引号,另一个包含三个单引号。

如果您的意思是当使用 shell 的引用规则解释时它们是否相同,那么再次不。"Chapitre 2 : L'accès au système.md"将字符串 表示Chapitre 2 : L'accès au système.md为单个 shell 单词(因为引号将其保持在一起)。

另一方面,'Chapitre 2 : L'accès au système.md'表示字符串Chapitre 2 : Laccès, au, système.md(三个不同的 shell 单词,因为有未加引号的空格)和一个没有结束伙伴的开引号。如果您在 shell 命令行中输入该内容,它将等待另一行的输入,以期获得结束引号。如果您在 shell 命令行上将这些作为参数输入到命令中,而没有最后的杂散引号,则该命令可能会尝试访问这三个不同的文件。

  1. 我应该如何在 gvim 命令中写入文件名以获得'Chapitre 2 : L'accès au système.md'我想要在 ls 命令的输出中读取的确切文件名?

您无法以输出 shell 样式带引号字符串的模式ls进行输出'Chapitre 2 : L'accès au système.md',因为这不是有效的 shell 样式带引号字符串:它最后有一个未闭合的引号。


现在,如果我们回到你首先说的话:

我必须编辑一个文件,其名称必须为 : Chapitre 2 : L'accès au système.md,其中包含撇号。

有几种方法可以在 shell 中表示它。其中之一是使用双引号,这ls也适用于您:"Chapitre 2 : L'accès au système.md"。这是有效的,因为里面的字符在双引号中都不是特殊的(它只有空格和单引号来保护),但如果文件名包含例如美元符号,则不起作用。如果它确实有美元符号,您可以用反斜杠转义它们:\$

另一种方法是对除单引号本身之外的所有内容使用单引号,并将转义单引号放在我们想要的位置:'Chapitre 2 : L'\''accès au système.md'。它包含三个部分:'Chapitre 2 : L'\'、 和'accès au système.md',引号和反斜杠被删除,结果连接到单个单词Chapitre 2 : L'accès au système.md

答案2

对于这两个问题,请使用 转义特殊字符\,这样它们就不会被解释(我假设它是 bash)。按照你的例子:

ls Chapitre\ 2\ :\ L\'accès\ au\ système.md
或者
gvim Chapitre\ 2\ :\ L\'accès\ au\ système.md

请参阅Bash 参考手册了解更多信息。

答案3

带有空格和特殊字符的名称始终是问题的根源。引用总是很棘手...

gvim "Chapitre 2 : L'accès au système.md" 

正在按您的意愿工作。ls显示额外的引号 (") 以更清晰地分隔文件名,但引号不在名称中。

如果这样做,ls | more您将看到没有保护的名称。



如果您确实需要更复杂的名称(坏主意),您可以连接带引号的块和受保护的元素(请参阅@ferranm)。

示例 - 名为 的文件a filename with quotes", apostrophes 'and bars (\) 可以创建为 3 个块的总和"a filename with quotes" + '", ' +"apostrophes 'and bars (\)"

touch "a filename with quotes"'", '"apostrophes 'and bars (\)"

相关内容