ls -b, --escape 的有用示例

ls -b, --escape 的有用示例

我是 Ubuntu 新手,正在学习相关ls参数。

我已经测试了这些-b, --escape论点(print C-style escapes for nongraphic characters),但没有找到如何使用它的有用例子。

\*\?\¿\º\ª\?\¿\&\%\$\·SpecialCharacterfile.txt我已经使用创建了一个名为的文件touch,但是当我使用ls或时,ls -b它会列出相同的内容。

*?¿ºª?¿&%$·SpecialCharacterfile.txt

我使用 Ubuntu 14.04.5 LTS

答案1

所有字符都是图形(它们具有可见的字形)。尝试使用包含空格和不可见字符的文件名:

$ touch $'\n\t\b\a\b'
$ ls -b
\n\t\b\a\b
$ echo *


$ printf "%q\n" *
$'\n'$'\t'$'\b'$'\a'$'\b'

一个实际有用的例子,否则输出会很棘手:文件名\r中意外插入了字符,因为 DOS 文件结尾在操作的中间某处妨碍了操作:

$ od -c file-list 
0000000   s   o   m   e   -   f   i   l   e   .   t   x   t  \r  \n
0000017
$ xargs -a file-list touch
$ ls -b
\n\t\b\a\b  file-list  some-file.txt\r

我实际上在 U&L 上的一些帖子中看到过这种情况。就我个人而言,我通常会将ls -q其复制粘贴到命令行本身:

$ ls -q
''$'\n\t\b\a\b'  ' '   file-list  'some-file.txt'$'\r'

新版本中的默认行为lsls -q为了交互使用:为什么“ls”突然用单引号括起带有空格的项目?

答案2

例如我发现自己

$ touch "Hello This is my file"
$ ls
Hello This is my file

-b选项

$ ls -b
Hello\ This\ is\ my\ file

当我想在代码的其他地方使用输出时,第二个不是更好吗?

答案3

您创建文件的方式可能是直接粘贴测试。要创建带有反斜杠转义的文件,您需要使用$'...'引号类型。

因此创建文件应该是:

$ touch one$'\n'two  three$'\t'four

他们 ls -b将向我们展示他们的代表:

$ ls -b                                                    
one\ntwo  three\tfour

虽然默认ls不会:

$ ls
one?two  three?four

请注意,文件中的反斜杠转义可能会破坏你的脚本,因此永远不应该解析 ls. 而其主要目的正是ls -b— — 查看文件名,并对其进行潜在故障排除。

答案4

此外muru 的回答这解释了你的文件名中没有一个字符是非图形的,我要指出的是,你的文件名实际上并不包含任何反斜杠(当然,shell 在运行命令时会删除它们)

如果确实如此,-b将导致它们被打印出并带有转义符:

$ touch 'hi\(zanna' hi\(zanna
$ ls
hi(zanna  hi\(zanna
$ ls -b
hi(zanna  hi\\(zanna

相关内容