文件名中的特殊字符(\#033OA)


10

我在rsync期间遇到了一个非常顽固的错误,出现了一个小问题。这是由文件名中包含特殊字符的文件引起的。还有其他一些,但是我可以通过对文件名的编码进行一些转换来解决。但是,我什至找不到这个文件。

所以这是rsync所说的:

../.\#033OA.tex.pyD0MB" failed: No such file or directory (2)

首先要注意的是,字符代码不能是十六进制或八进制的,所以我用Google搜索了它,仅发现了这个。因此它可能是一个CURSOR UP字符(或不是)。我试过了

ls -la *`printf '\033OA'`*

无济于事。我也曾尝试将该目录的ls输出管道化,od但无济于事。

我还可以做些什么?还是我一直在寻找什么角色?

谢谢


1
试试看ls -b,它应该显示C风格的转义

谢谢...这有所帮助...可以在printf的帮助下将其移动,然后...如果您将此评论重新发布为答案,我会很乐意接受:)
luxifer

Answers:


9

您可以使用的-b选项ls,将非图形字符显示为C样式的转义序列。


1

ls -aq将打印所有文件名,用?代替每个不可打印的字符。在许多unix变体上,ls -ABls -Ab(检查您的手册页)将打印八进制转义符。使用ls -aq,您可以将显示的输出用作外壳模式。

$ ls -Aq
.?OA.tex.pyD0MB
… more stuff …
$ mv -i .?OA.tex.pyD0MB weird-file
$ less weird-file

另一种获取文件名的方法是使用shell的完成:输入mv .Tab重复按直到插入奇怪的名称。


ls -q没有显示文件,ls -b但是显示了。也许是因为其文件名不存在,[weird-character]OA.tex但确实如此`printf %b '\033OA'`.tex
luxifer 2011年

@luxifer .文件名的开头有一个,因此您需要ls -Aqls -aq。而且,如果您使用外壳通配符,则需要.明确指定:*将不包含文件,但.*将包含文件。
吉尔(Gilles)'所以

不,没有!我发布的输出来自rsync,这是该行的结尾。$DESTINATION/.$FILENAME在将文件移动到正确名称之前,Rsync首先复制到。因此,在源头文件.的名称开头没有。而且,如前所述,ls -q不会显示文件,而只会显示文件ls -b
luxifer 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.