8

При распаковке архива я столкнулся с каталогом, который ls сообщает как "??????????????? ?????». Предположительно, имя не в юникоде? Во всяком случае, я не могу найти способ получить доступ к папке. Я пробовал cd $(find -inum inode_number) , но это дает мне

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

Есть ли другой способ получить доступ к папке напрямую по номеру инода?

7 ответов7

2

Общий подход для работы с любым каталогом (или файлом) заключается в использовании его номера inode.

Во-первых, используйте ls, чтобы получить инод нужной папки:

ls -lia
  • -l для длинного списка (необязательно)
  • -i чтобы получить значения инода
  • -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

Покажет вам символы, включая любые скрытые дополнительные пробелы, которые могут быть в конце (обратите внимание на дополнительные пробелы в конце в их примере)

После того, как вы узнаете, какие управляющие символы находятся в игре, и есть ли дополнительные скрытые пробелы, вы сможете найти способ перейти к каталогу, экранировав управляющие символы. В противном случае у вас есть несколько вариантов переименования каталога.

На странице выше также удобно использовать быстрый и грязный метод удаления управляющих символов с помощью команды mv, который, я думаю, будет работать, пока вы действительно выходите из пробела, но НЕ экранируете вопросительные знаки (таким образом, делая их односимвольными). подстановочные знаки), и до тех пор, пока ничего не существует в каталоге, где находится этот мошеннический каталог. Причина этих явных требований заключается в том, что вы используете только символы подстановки и один пробел, и поэтому вы не хотите, чтобы подстановочный знак непреднамеренно совпадал с любым другим файлом или каталогом.

Если описанный выше метод не работает, вы почти наверняка можете использовать метод find, упомянутый в других ответах, другим способом. Вместо того, чтобы пытаться перейти в каталог, используя номер инода, который, как вы сказали, вы пробовали, вы можете переименовать его, используя номер инода. Обязательно скопируйте весь набор из 3 строк для этой одной команды со страницы выше (замените часть «требуемого имени» на фактическое имя, которому вы хотите переименовать его, однако).

Как только каталог переименован, вы сможете получить к нему доступ. Я могу только надеяться, что он также не содержит файлов с управляющими кодами в именах, или вам придется промыть и повторить для каждого файла (и / или подкаталога) в каталоге, который вы только что переименовали, в этот момент цикл for будет вероятно, будет разумно просто назвать каждый файл как число, увеличивая с 1. :-)

0

«?«имеет особое значение в оболочке, это означает« любой символ, включая ни одного ». Так что если ваш файл действительно называется "??????????????? ?????"Вы, вероятно, должны избежать"?"(и пробелы), чтобы вы могли попробовать что-то вроде cd \?\?\?\?\?\?\ \?\?\?\? (если вы еще не пробовали)

Это предполагает, что кто-то намеренно дал файлу хитрое имя, а не искаженное / поврежденное / незаконное кодирование.

0

Один из простых способов узнать, что там, - это подключить FTP к машине с FileZilla. Затем вы можете использовать FileZilla, чтобы переименовать каталог.

0

Используйте файловый браузер, такой как Midnight Commander (текст), Nautilus (GNOME) или Dolphin (KDE) для работы с каталогом.

0

работать с каталогами (или файлами), которые имеют странные / трудные для ввода имена:

1) Запустите ls -i чтобы обнаружить индекс файла.

Эта опция ls даст вам каждое имя файла и идентификатор для этого файла в файловой системе (индекс)

2) Используйте команду find для запуска команды для файла

скажем, индекс был 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 \;

дать ему новое имя, сохраняя старое имя

(возможно, вы могли бы запустить и другие команды. К сожалению, я не смог использовать эту строку для запуска cd)

0

Сделай ls .  Есть ли что-нибудь в каталоге (файл или подкаталог) с именем, которое длиннее, чем ваш загадочный подкаталог (а это 21, если ваш «??????????????? ?????» это точно)?  Затем переименуйте их в более короткие имена или переместите в другие каталоги.  Затем введите

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

Этот подстановочный знак (20 знаков вопроса, за которым следует звездочка) должен совпадать с любым именем длиной не более 20 символов - и первая указанная мною инструкция должна была гарантировать, что ваш подкаталог mystery - единственное, что соответствует этому шаблону.  Но это может быть более полезным сделать

mv ????????????????????* новое_имя

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .