文件名中使用特殊字符

文件名中使用特殊字符

我需要创建一个名为*'test'*

如果我写touch \'test\'

ls节目'test'

但如果我写touch \*\'test\'\*

ls现在显示*'\''test'\''*

有什么窍门?有人可以解释我做错了什么吗?

我的操作系统是Ubuntu 20.04

答案1

问题是 GNUls试图成为有帮助的通过以明确的引用格式输出奇数文件名,类似于在 shell 中输入它们以获得相同名称的方式。

有时它会有所帮助,有时只会增加混乱。要关闭该功能,请设置控制环境变量:

export QUOTING_STYLE=literal
ls

或者使用相应的命令行标志:

ls --quoting-style=literal

或更短的ls -N.

您可以通过引用来创建带有奇怪字符的文件名:

touch "*'test'*"                       # « *'test'* »

请记住,具有不同类型引号的字符串可以相邻(这里我们有一个单引号字符串,后面紧跟一个双引号字符串),因为 shell 在执行命令行之前处理带引号的字符串:

touch 'Quotes "here" at'" 5 o'clock"    # « Quotes "here" at 5 o'clock »
#     '←-first-string-→'"←-second-→"

你的例子:

touch \'test\'                         # « 'test' »
touch \*\'test\'\*                     # « *'test'* »

ls -1 --quoting-style=literal          # List files one per line
  *'test'*
  'test'

答案2

如果我写touch \'test\'

ls 显示'test'

不!表明"'test'"

但如果我写touch \*\'test\'\*

ls 现在显示*'\''test'\''*

不!表明'*'\''test'\''*'

现代版本的 GNU ls 以可以在 Bourne 风格的 shell(bash、zsh 等,我认为它也与 Fish 兼容)中键入的方式显示文件名。您可以使用touch "'test'"and创建这些文件'*'\''test'\''*'(但是当然有多种方法可以进行引用,选择不同的方法也没有问题)。

您可以告诉ls使用不同的方式来显示特殊字符,例如ls --literal打印任何文件名(即使结果不明确,例如如果名称包含可能与列显示混淆的空格,或者如果名称包含换行符或不可打印的字符)。看的文档--quoting-style对于其他可用样式。

答案3

在某些系统上,ls向带有“特殊”字符的文件名添加单引号。看这个问题了解详情。

由于您希望最终文件名中包含单引号,因此可以使用双引号(只要目录中没有其他文件)。在我的 Ubuntu 22.04 上,这按预期工作:

touch "*'test'*"
ls --quoting-style=literal

相关内容