Перейти в каталог с неизвестным именем

8

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

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

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

jackd243
источник
Возможно ли это лексически первым в списке каталогов? Тогда cd */может сработать. *Следует расширить понятное для оболочки описание каталога и cdигнорировать дополнительные аргументы. Другим способом может быть использование графического файлового менеджера (включая MC на основе терминала) или встроенных навигаторов дерева файлов, например, в Vim. Вы также можете поэкспериментировать с -execпереключением на find, not with cd` напрямую (это встроенная оболочка), но, например, с lsдругими инструментами.
Даниэль Андерссон
@Daniel: в некоторых оболочках cdс несколькими аргументами происходит сбой.
Скотт
@ Скотт: правда. POSIX не определяет поведение нескольких аргументов. Bash и Dash игнорируют дополнительные аргументы, csh завершается с " too many arguments".
Даниэль Андерссон

Ответы:

3

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

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

ls -lia
  • -l для длинного списка (необязательно)
  • -i получить значения инода
  • -a просматривать все файлы, даже скрытые (необязательно)

В списке вы увидите длинный номер в первом столбце, примерно такой:

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

Теперь вы можете перейти в этот каталог, используя:

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

... но заменив ###### длинным номером, который вы получили в списке каталогов.

Конечно, команда не должна быть cd. Это может быть rm, cp, mv, и т.д. ...

Tyilo
источник
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. :-)

Speeddymon
источник
0

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

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

Valrian
источник
1
Но помните, что lsлюбит отображать не-ASCII символы (≥0x7F) как ?–– так что имя каталога, вероятно, не просто строка знаков вопроса.
Скотт
0

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

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

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

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

Скотт
источник
3
Может быть полезно запустить lsс параметром либо --quoting-style=shellили, --quoting-style=escapeчтобы заставить его создавать правильно экранированную версию этого имени файла.
Дэн Д.
1
@DanD. +1 за классный вариант, о котором я не знал. Обычно я просто использую файловый менеджер с графическим интерфейсом, когда с этим приходится иметь дело, но это может пригодиться, если мне придется работать с консоли или в скрипте.
Джо
0

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

kmort
источник
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 \;

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

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

josinalvo
источник