转到名称未知的目录


8

在打开压缩包时,我遇到了一个目录,ls报告为“ ????????????????????????”。大概名称不是用unicode吗?无论如何,我无法找到一种访问文件夹的方法。我已经尝试过了cd $(find -inum inode_number),但这给了我

"bash: cd: ./??????????: No such file or directory".

还有另一种直接通过其索引节点号访问文件夹的方法吗?


在目录列表中可能是词法优先的吗?然后cd */可能会工作。*应该扩展该目录的Shell可以理解的描述,并cd忽略其他参数。另一种方法可能是使用图形文件管理器(包括基于终端的MC)或Vim中的内置文件树导航器。您也可以尝试直接-exec切换到find, not with cd`(这是内置的shell),但是可以使用eg ls和其他工具进行试验。
Daniel Andersson

@Daniel:在某些shell中,cd使用多个参数会失败。
斯科特,

@斯科特:是的。POSIX没有指定多个参数的行为。Bash和Dash忽略了多余的参数,csh以“ too many arguments” 退出。
Daniel Andersson

Answers:


3

能够在任何目录(或文件)上运行的通用方法是使用其inode编号。

首先,使用ls获取有关文件夹的索引节点:

ls -lia
  • -l 长时间列出(可选)
  • -i 获取inode值
  • -a 查看所有文件,甚至隐藏文件(可选)

在清单中,您会在第一栏中看到一个长数字,如下所示:

2104697 drwx------ 2 user group 4096 date time WEIRD_DIRNAME

现在,您可以使用以下命令转到该目录:

cd "$(find -inum ######)"

...但是将######替换为您在目录列表中得到的长号。

当然命令不必是cd。这可能是rmcpmv ...


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

将向您显示字符,包括可能在结尾处包含任何隐藏的其他空格(请在示例中注意结尾处的多余空格)

一旦知道正在使用哪些控制字符以及是否存在其他隐藏的空白,您就可以通过转义控制字符来最终找到cd到目录的方法。失败的话,您有几个重命名目录的选项。

上一页也很方便地提供了一种通过mv命令删除控制字符的快速而又肮脏的方法,我认为这是可行的,只要您确实避开了空格,但是却不避开了问号(因此使它们成为单个字符即可)通配符),只要该恶意目录所在的目录中没有其他内容。提出这些明确要求的原因是因为您只使用通配符和单个空格,所以您不希望通配符无意中匹配任何其他文件或目录。

如果上述方法不起作用,您几乎可以肯定地以其他方式使用其他响应提到的find方法。您可以使用inode编号重命名它,而不必尝试使用您说过的inode编号cd到目录。只需确保从上一页复制该命令的整个3行集即可(将“ desired-name”部分替换为您要重命名的实际名称)。

重命名目录后,您应该可以访问它。我只能希望它也不会在名称中包含带有控制代码的文件,否则您将不得不冲洗并重复刚才重命名目录中的每个文件(和/或子目录),这时将出现for循环明智的做法是将每个文件命名为数字,从1开始递增。


0

“?” 在外壳中有特殊含义,表示“任何字符,包括一个字符”。因此,如果您的文件确实名为“ ????????????????????????” 您可能必须转义“?” (和空格),因此您可以尝试使用cd \?\?\?\?\?\?\?\ \?\?\?\?(如果您尚未尝试)

假设有人故意给文件指定了棘手的名称,而不是乱码/损坏/非法的编码。


1
但请记住,ls喜欢以显示非ASCII字符(≥0x7F)的?-这样的目录名可能不只是一个问号的字符串。
斯科特

0

做一个ls。目录(文件或子目录)中是否有任何名称比您的神秘子目录(21,如果您的“ ????????????????????????”是准确)?然后将它们重命名为短名称或将其移至其他目录。然后输入

cd ????????????????????*

该通配符(20个问号,后跟一个星号)应与任何长度等于或大于20个字符的名称匹配-并且我给出的第一条指令应确保您的神秘子目录是唯一与该模式匹配的东西。但是这样做可能会更有用

mv ????????????????????* 新名字


3
ls使用--quoting-style=shellor或--quoting-style=escape选项强制运行它以生成该文件名的正确转义版本可能会有所帮助。
Dan D.

1
@丹 +1是我不知道的不错选择。我通常只在需要处理类似gui的文件时使用gui文件管理器,但是如果我必须在控制台或脚本中工作,它可能会派上用场。
2013年

0

一种查看其中内容的简单方法是使用FileZilla通过FTP传输到计算机。然后,您可以使用FileZilla重命名目录。


0

使用文件浏览器,例如Midnight Commander(文本),Nautilus(GNOME)或Dolphin(KDE)来处理目录。


0

用于处理名称奇怪/难以键入的目录(或文件):

1)运行ls -i以发现文件的索引节点。

ls选项将为您提供文件的每个名称,以及文件系统上该文件的标识符(索引节点)

2)使用find在文件上运行命令

说inode是9961926

你可以跑

 find * -prune -inum 9961926 -exec rm -i {} \;

删除文件

要么

 find * -prune -inum 9961926 -exec mv {} other-name \;

把它改成更好的名字

甚至

 find * -prune -inum 9961926 -exec ln -s {} non-horrible-name \;

给它一个新名字,同时保留旧名字

(大概您也可以运行其他命令。不幸的是,我无法使用此行来运行a cd

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.