文件名中带有 '(撇号)

Mar*_*arc 4 filenames files

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

'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. 我应该如何在我的gvim命令中写入文件名以获取'Chapitre 2 : L'accès au système.md'我想在ls命令的输出中读取的确切文件名?

ilk*_*chu 6

您正在使用一些系统,其中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"将 string 表示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 命令的输出中读取的确切文件名?

你不能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


fer*_*anm 5

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

\n

ls Chapitre\\ 2\\ :\\ L\\\'acc\xc3\xa8s\\ au\\ syst\xc3\xa8me.md
\n 也不
\n gvim Chapitre\\ 2\\ :\\ L\\\'acc\xc3\xa8s\\ au\\ syst\xc3\xa8me.md

\n

有关详细信息,请参阅Bash 参考手册。

\n