Удалите файл в Linux, используя номер индекса

14

Если вы создаете файл в UNIX / Linux со специальными символами, например touch \"la*, вы не можете удалить его с помощью rm "la*. Вы должны использовать номер инода (вы можете, если вы добавите имя \перед именем, я знаю, но вам, как пользователю, нужно угадать, что оно использовалось при создании файла).

Я проверил справочную страницу для rm, но там нет упоминания номера инода. Делать rm inodenumberтоже не получается.

Какая команда для этого?

KdgDev
источник

Ответы:

23

Некоторые другие методы включают в себя:

избегая специальных символов:

[~] $ rm \ "la \ *

используйте команду find и ищите только текущий каталог. Команда find может искать номера инодов и имеет удобный -deleteпереключатель:

[~] $ ls -i
7404301 "ла *

[~] $ найти. -maxdepth 1-type f -inum 7404301
./"la*

[~] $ найти. -maxdepth 1-type f -inum 7404301 -delete
[~] $ ls -i
[~] $
Джон Т
источник
Хех, найти было бы проще, чем мое предложение, я бы никогда не заметил -inum :)
У Find есть много замечательных переключателей, которые нужно изучить, это мой швейцарский инструмент для армейского ножа, если честно :)
John T
т: о, так верно.
Акира
В Solaris нет параметров -delete из -maxdepth.
Гатри
Вы должны ограничить поиск с помощью -xdevопции, так как другие смонтированные файловые системы могут также иметь несвязанные файлы с тем же номером инода.
Йонас Берлин
5

Может быть, я что-то упустил, но ...

rm '"la*'

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

Игнасио Васкес-Абрамс
источник
ну, это будет работать только для текущего каталога, но это действительно веская причина для беспокойства. Глупо, что я это пропустил. Тем не менее, не удаляет файл, хотя.
KdgDev
3
Конечно, нет. Файл удаляется только в том случае, если на него больше не указано имя файла и нет процессов, удерживающих его открытым.
Игнасио Васкес-Абрамс
5

Если вы действительно хотите это сделать - и ваш вариант использования на самом деле не выглядит так, как нужно, вы можете попробовать инструменты отладки файловой системы. Если вы готовы все потерять, то есть.

Например, для ext2 / 3/4 debugfsкоманда имеет опцию «kill_file», которая, кажется, принимает inode. Как уже упоминалось в других ответах, это будет повредить вашу файловую систему, как будет записей каталога , указывающих на несуществующий файл. Запуск fsckпосле может быть в состоянии исправить это. Вряд ли вы можете сделать это в смонтированной файловой системе.

Но я настоятельно рекомендую вам просто использовать соответствующее экранирование / цитирование и удалять такие файлы с помощью обычной rmкоманды, как было упомянуто в предыдущем ответе, - и использовать rm -iдля дополнительной безопасности при работе с именами файлов, содержащими символы перетаскивания, такие как *


источник
1

Несмотря на то, что я настоятельно рекомендую подход «экранировать специальные символы», всегда есть clriкоманда, когда вы действительно хотите исправить повреждения файловой системы.

mpez0
источник
2
Следует отметить, что clriобычно присутствует только в системах Oracle (например, SunOS).
can-ned_food
1

Вы можете удалить файлы, начинающиеся с тире, позвонив rm -- filename.

uli42
источник
1
Похоже, что это комментарий к этому ответу, а не ответ на вопрос ОП.
Я говорю Восстановить Монику
1

Проблема, с которой я столкнулся, заключалась в удалении имени файла, начинающегося с тире - rm всегда хочет интерпретировать его как имя хоста. Я решил это с помощью:

rm ./-g4xxx
Энтони V Эдвардс
источник