![Перейти в каталог с неизвестным именем](https://rvso.com/image/1346554/%D0%9F%D0%B5%D1%80%D0%B5%D0%B9%D1%82%D0%B8%20%D0%B2%20%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%20%D1%81%20%D0%BD%D0%B5%D0%B8%D0%B7%D0%B2%D0%B5%D1%81%D1%82%D0%BD%D1%8B%D0%BC%20%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BC.png)
При распаковке тарбола я обнаружил каталог, который ls
сообщается как "??????????????? ?????". Предположительно, имя не в юникоде? В любом случае, я не могу придумать, как получить доступ к папке. Я пробовал cd $(find -inum inode_number)
, но это дает мне
"bash: cd: ./??????????: No such file or directory".
Есть ли другой способ получить доступ к папке напрямую по ее номеру inode?
решение1
Общий подход к работе с любым каталогом (или файлом) заключается в использовании его номера инода.
Сначала используйте 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
,и т. д....
решение2
Поскольку символы, скорее всего, являются международными, они, скорее всего, отображаются как управляющие коды в вашем наборе символов en_US, поэтому ls отображает их как вопросительные знаки.
Это может быть связано с выбором вашего дистрибутива по умолчанию псевдонимизировать ls в глобальном профиле. Например:
alias ls='ls -q'
Вы можете проверить, выполнил ли ваш дистрибутив это, введя в командной строке:
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, упомянутый в других ответах, другим способом. Вместо того, чтобы пытаться перейти в каталог с помощью cd, используя номер inode, что, как вы сказали, вы пробовали, вы можете переименовать его, используя номер inode. Просто убедитесь, что вы скопировали весь набор3строки для этой команды со страницы выше (замените часть «desired-name» фактическим именем, в которое вы хотите ее переименовать).
После переименования каталога вы сможете получить к нему доступ. Я могу только надеяться, что он не содержит также файлов с управляющими кодами в именах, иначе вам придется промывать и повторять для каждого файла (и/или подкаталога) в каталоге, который вы только что переименовали, и в этом случае цикл for, вероятно, будет разумным просто назвать каждый файл номером, увеличивая его с 1. :-)
решение3
"?" имеет особое значение в оболочке, оно означает "любой символ, включая ни один". Так что если ваш файл действительно называется "??????????????? ?????" вам, вероятно, придется экранировать "?" (и пробелы тоже), так что вы можете попробовать что-то вроде cd \?\?\?\?\?\?\?\ \?\?\?\? (если вы еще этого не пробовали)
Это предполагает, что кто-то намеренно дал файлу такое сложное имя, а не искаженную/поврежденную/неправильную кодировку.
решение4
Один из простых способов увидеть, что там находится, — это подключиться к машине по FTP с помощью FileZilla. Затем вы можете использовать FileZilla для переименования каталога.