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


14

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

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

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

Ответы:


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команда, когда вы действительно хотите исправить повреждения файловой системы.


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


1

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

rm ./-g4xxx
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.