在解压 tarball 时,我遇到了一个ls
报告为“??????????????? ???????”的目录。大概是名称不是 unicode 的吧?无论如何,我找不到访问该文件夹的方法。我试过了cd $(find -inum inode_number)
,但结果却让我
"bash: cd: ./??????????: No such file or directory".
还有其他方法可以直接通过文件夹的 inode 号来访问文件夹吗?
答案1
对任何目录(或文件)进行操作的一般方法是使用它的 inode 编号。
首先,使用 ls 获取相关文件夹的 inode:
ls -lia
-l
长列表(可选)-i
获取 inode 值-a
查看所有文件,甚至隐藏文件(可选)
在列表中,您会在第一列看到一长串数字,如下所示:
2104697 drwx------ 2 user group 4096 date time WEIRD_DIRNAME
现在你可以使用以下命令更改到该目录:
cd "$(find -inum ######)"
...但用目录列表中获得的长数字替换######。
当然,命令不一定非得是cd
。可以是rm
,cp
,mv
,ETC...
答案2
由于这些字符可能是国际字符,它们很可能在您的 en_US 字符集中出现为控制代码,这就是 ls 将它们显示为问号的原因。
这可能是由于您的发行版在全局配置文件中默认选择使用 ls 作为别名。例如:
alias ls='ls -q'
你可以在 shell 中输入以下内容来查看你的发行版是否已完成此操作:
alias ls
它将打印出如下内容:
$ alias ls
alias ls='ls --color=auto'
下面链接的页面表明,如果您执行“ls -b”,您将看到八进制控制代码,因此您至少知道正在使用哪些字符。
http://www.arsc.edu/arsc/support/howtos/nonprintingchars/
假设这不起作用你还有另一个选择,也提到了靠近底部的地方:
我之前不知道的一个工具叫 OctalDump(在 Debian 上 - /usr/bin/od)
$ ls | od -b
将向您展示控制代码的八进制形式。
$ ls | od -c
将显示字符,包括末尾可能存在的任何隐藏的额外空格(请注意其示例中末尾的额外空格)
一旦您知道了正在使用的控制字符以及是否存在额外的隐藏空格,您就可以通过转义控制字符来想办法进入目录。如果做不到这一点,您有几个选项可以重命名目录。
上面的页面还提供了一个方便的快速方法,即通过 mv 命令删除控制字符,我认为这种方法是可行的,只要您确实转义了空格,但不转义问号(从而使它们成为单个字符通配符),并且只要此恶意目录所在的目录中不存在任何其他内容。这些明确要求的原因是因为您只使用通配符和单个空格,因此您不希望通配符无意中匹配任何其他文件或目录。
如果上述方法不起作用,您几乎可以肯定可以使用其他回复中提到的 find 方法,但方法不同。与其尝试使用 inode 编号 cd 到目录(您说您已经尝试过),不如使用 inode 编号重命名它。只需确保复制整个3从上面的页面中找到该命令的行(将“所需名称”部分替换为您要重命名的实际名称)。
一旦目录被重命名,您就应该能够访问它。我只能希望它不包含名称中带有控制代码的文件,否则您将不得不对刚刚重命名的目录中的每个文件(和/或子目录)进行冲洗和重复,此时 for 循环可能明智地将每个文件命名为数字,从 1 开始递增。:-)
答案3
“?”在 shell 中具有特殊含义,它表示“任何字符,包括无字符”。因此,如果您的文件确实名为“??????????????? ????”,则可能必须转义“?”(以及空格),因此您可以尝试使用类似 cd \?\?\?\?\?\?\?\ \?\?\?\?(如果您尚未尝试)
这是假设有人故意给予文件那个棘手的名称,而不是乱码/损坏/非法的编码。
答案4
要查看其中的内容,一个简单的方法是使用 FileZilla 通过 FTP 传输到机器。然后,您可以使用 FileZilla 重命名目录。