我需要创建一个名为*'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