轉到名稱未知的目錄

轉到名稱未知的目錄

在解壓縮 tarball 時,我遇到了一個ls報告為“??????????????? ??????” 的目錄。據推測,該名稱不是 unicode 的?無論如何,我無法找到存取該資料夾的方法。我試過了cd $(find -inum inode_number),但這給了我

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

還有另一種方法可以直接透過索引節點號存取資料夾嗎?

答案1

能夠對任何目錄(或檔案)進行操作的通用方法是使用其索引節點號。

首先,使用 ls 取得相關資料夾的 inode:

ls -lia
  • -l長列表(可選)
  • -i取得索引節點值
  • -a查看所有文件,甚至隱藏文件(可選)

在清單中,您將在第一列中看到一個很長的數字,如下所示:

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

現在您可以使用以下命令變更到該目錄:

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

....但用您在目錄列表中獲得的長數字替換######。

當然,該命令不一定是cd。它可能是rmcpmvETC

答案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 開始遞增)可能是明智的做法。

答案3

“?”在shell中有特殊的意義,它的意思是「任何字符,包括無」。所以如果你的文件確實名為“?????????????????????”你可能必須逃避“?” (還有空格)所以你可以嘗試類似 cd \?\?\?\?\?\?\ \?\?\?\? (如果你還沒嘗試過)

假設有人故意給文件起了那個棘手的名稱,而不是亂碼/損壞/非法編碼。

答案4

查看其中內容的簡單方法是使用 FileZilla 透過 FTP 傳輸到電腦。然後您可以使用 FileZilla 重新命名該目錄。

相關內容