Перейдіть до каталогу з невідомим іменем


8

Розпаковуючи тарбол, я зіткнувся з каталогом, який lsповідомляє як "??????????????? ?????". Імовірно, ім'я не в Unicode? У всякому разі, я не можу знайти спосіб доступу до папки. Я спробував cd $(find -inum inode_number), але це дає мені

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

Чи є інший спосіб отримати доступ до папки безпосередньо за її номером inode?


Це, можливо, лексично перше в списку каталогів? Тоді cd */може спрацювати. *повинен розширити оболонку, зрозумілий опис каталогу, і cdігнорує зайві аргументи. Іншим способом може бути використання графічного файлового менеджера (включаючи MC на базі терміналу) або вбудованих навігаторів дерев файлів, наприклад, Vim. Ви також можете експериментувати безпосередньо з -execперемиканням на find, not with cd` (який є вбудованою оболонкою), але, наприклад, з lsіншими інструментами.
Даніель Андерссон

@Daniel: У деяких оболонках cdбагато аргументів не вдається.
Скотт

@Scott: Правда. POSIX не визначає поведінку декількох аргументів. Bash і Dash ігнорують додаткові аргументи, csh виходить з " too many arguments".
Даніель Андерссон

Відповіді:


3

Загальним підходом до роботи в будь-якому каталозі (або файлі) є використання його номера inode.

По-перше, використовуйте 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

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

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

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

Якщо вищевказаний метод не працює, ви можете майже впевнено використовувати метод пошуку, згаданий іншими відповідями, по-іншому. Замість того, щоб намагатися ввести каталог в каталог за допомогою номера inode, який ви сказали, що ви намагалися, ви можете перейменувати його, використовуючи номер inode. Просто не забудьте скопіювати весь набір із 3 рядків для цієї команди зі сторінки, що вводиться вище (замініть частину "бажаного імені" справжньою назвою, на яку ви хочете перейменувати її).

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


0

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

Це припускаючи, що хтось навмисно дав файлу хитру назву, а не кодовану / пошкоджену / незаконну кодування.


1
Але пам’ятайте, що lsлюбить відображати символи, що не належать до ASCII (≥0x7F), як ?–– тому ім’я каталогу, ймовірно, не є лише рядком знаків запитання.
Скотт

0

Зробіть ls. Чи є в каталозі (файл або підкаталог) щось із ім'ям, яке довше вашого загадкового підкаталогу (а це 21, якщо ваш "??????????????? ?????" є точний)? Потім перейменуйте їх на короткі назви або перемістіть їх в інші каталоги. Потім введіть

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

Цей підстановочний знак (20 знаків запитання, за яким слід зірочкою) повинен відповідати будь-якому імені, що має 20 символів чи довше –– і перша інструкція, яку я дала, повинна була забезпечити, щоб ваш загадковий підкаталог - це єдине, що відповідає цьому шаблону. Але це може бути корисніше зробити

mv ????????????????????* new_name


3
Може бути корисним запустити lsз одним --quoting-style=shellабо --quoting-style=escapeваріантом, щоб змусити його створити належну версію цього імені файлу.
Дан Д.

1
@DanD. +1 за класний варіант, про який я не знав. Я зазвичай просто використовую диспетчер файлів gui, коли щось подібне доводиться вирішувати, але це може стати в нагоді, якщо мені доведеться працювати з консолі або в сценарії.
Джо

0

Один з простих способів побачити, що там, - це FTP на машину з FileZilla. Тоді ви можете використовувати FileZilla для перейменування каталогу.


0

Для роботи з каталогом використовуйте браузер файлів, наприклад «Midnight Commander» (текст), Nautilus (GNOME) або «Дельфін» (KDE).


0

працювати з каталогами (або файлами), які мають дивні / важкі для введення імена:

1) Запустіть ls -iдля виявлення inode файлу.

Цей lsпараметр дає вам кожне ім'я файлу та ідентифікатор цього файлу у файловій системі (inode)

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)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.