Какую команду мне нужно использовать, чтобы удалить файл с именем `-rf`?


67

В какой-то момент я сделал что-то сумасшедшее, создав файл, называемый -rfмоей файловой системой.
Теперь я не могу понять, как его удалить ...

Я пробовал:

rm "-rf"
rm \-rf

Они просто выходят немедленно, аааа!

Кто-нибудь знает, как удалить этот файл? Желательно без случайной очистки всей моей папки.


33
Некоторые нервы пытаются rmполучить файл, вызываемый -rfиз вашей системы, не помня точный синтаксис!
— ChristopheD

3
Чтобы объяснить, почему они не работают: кавычки и экранирование анализируются вашей оболочкой (как правило, bash), а затем результат синтаксического анализа передается rm(в it argcи argv). Таким образом, оба эти результата приводят к массиву, ["rm", "-rf"]который передается rm, который делает то, что вы ожидаете.
— Танатос

3
Я думаю, что это ближе к дубликату этого из Unix и Linux stackexchange: unix.stackexchange.com/questions/1519/…
— frabjous

12
Старый кляп - получить файл с именем *в папку. Включите также одно имя -rfи посмотрите веселье ;-)
— RBerteig

@RBerteig: mkdir './-rf '(ls --classify, обычное значение по умолчанию в псевдониме оболочки, добавит /)

Ответы:


127
unlink -rf

Или же

rm -- -rf

47
Это наиболее полезное решение для изучения IMO, потому что '-', чтобы остановить обработку аргументов, стандартизировано во всех инструментах GNU
— Натан О'Салливан

1
Если быть более точным, то, что есть в GNUgetopt-- , означает большинство современных инструментов Linux.
— Джеффри Чжэн


34

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

vim .

а затем просто удалите строку с файлом (с помощью D, dd не будет работать).


5
хороший трюк! [Несколько бесполезных символов]
— Серхио Акоста,

Я не думал, что это заслуживает отрицательных голосов, которые были у меня, когда я впервые увидел этот ответ сегодня днем, но у меня не было возможности проверить, vimбыл ли режим Dired. Понятно, что редактирование самого каталога в текстовом редакторе не рекомендуется и не возможно без реального экспертного прыжкового прыжка. Обратите внимание, что это emacsбудет работать, и по той же причине.
— RBerteig

1
Дополнительные очки за умное использование Vim! :)
— Пьер-Антуан ЛаФайет

приятно знать;)
— schöppi

25

Универсальный метод для удаления странных имен файлов заключается в использовании.

 ls -li

найти номер индекса файла и затем использовать.

find ./ -inum <number of file> -delete

Не нужно помнить все особые случаи.


4
Не знал, findчто мог удалить файлы.
— zneak

Это также отлично подходит для перехвата файлов с неизвестными именами (начиная с символов пробела или включая их или заканчивая дополнительными пробелами в конце), при условии, что у вас есть доступ к приличной находке GNU на вашем боксе.
— Олфан

17

Несмотря на то, что я знаю об уловке «rm - -filename», обычно, когда я каким-то образом получаю файл с начальным именем, которое я хочу удалить, я запускаю файловый менеджер с графическим интерфейсом и делаю это оттуда, чтобы исключить возможность ошибок.


1
Он может вообще не иметь GUI, так что это может не сработать.
— Вуфферс

12
Если это было глупо и неправильно, возможно, это заслуживает отрицательного ответа, но я не верю в отрицательный ответ на этот вопрос только потому, что он «может не сработать». Никакого вреда это не принесет.
— JT.WK

4
Всегда есть полночный командир (или другие файловые менеджеры, основанные на curses) для тех, у кого нет X.
— thomasrutter


4

На тот случай, если вы работаете в не-GNU Unix, где вы чувствуете, что вернулись к каменному веку (нет --синтаксиса, нет -inumпереключателя для поиска, нет команды unlink, ваш редактор отказывается редактировать каталоги и т. Д. И т. Д.), Вы все равно можете помочь себе:

find . -name '-rf' -print | xargs rm -i

Это заставит find направить всех потенциальных кандидатов в rm, что, в свою очередь, будет запрашивать разрешение / отказ для каждого файла, который он передает.

Если вы rmдаже не поддерживаете -iкоммутатор (HP-UX 10.2 на PA-RISC 1.1?), Просто будьте осторожнее:

find . -name '-rf' -print
# check that find's output is exactly and only what you need to delete
find . -name '-rf' -print | xargs rm

Что делать, если ваша система даже не имеет find?
— Ли Райан

Это было бы действительно зло. Увы, я еще не встречал установку Unix без нее. Можете ли вы дать мне указатель?
— Олфан

Если подумать, мой ответ был бы более уместным, если бы вопрос задавался по поводу отказа сервера. Суперпользователи вряд ли имеют такую ​​же древнюю технику, о которой я говорю. И те, кто это сделает, научились помогать себе. ;-)
— Олфан

+1, @Olfan, в твою защиту, кто-то, кто только сейчас сталкивается с устаревшим Unix в шкафу где-то, все еще нуждается в ресурсе, чтобы изучить советы и приемы от ...
— RBerteig

3

Поддерживая ответ Джлидева , я бы улучшил:

rm -i -- -rf

быть в интерактивном режиме и запросить подтверждение, чтобы вы могли быть уверены, что вы удаляете. (хотя решение в порядке. Это просто для вашего спокойствия)

На самом деле, даже используйте это:

\rm -i -- -rf

чтобы быть уверенным, что вы не используете псевдонимы.


2

Как уже было предложено, я всегда использовал синтаксис

rm -rf -- filename

когда мне пришлось удалить файл с чертой в качестве префикса, потому что - говорит команде, что она не ищет какой-либо другой параметр, а только имена файлов.

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

rm -rf *

когда извиняется в моей защищенной папке, взорвется во время выполнения команды:

rm -rf -i filename1 filename2 .... (all the other files in the folder)

и оболочка, вместо того, чтобы немедленно удалить все, перестает запрашивать подтверждение (как требует опция -i).


+1 для -iвзлома имени файла - «Я» был настроен скептически, но это проверяется!
— 2010 г.

2

В прошлый раз у меня была эта проблема, я решил ее с помощью:

питон

импорт ОС

os.remove ( "- ВЧ")


1

Мартин Клейтон прав.

Это очень просто и логично. Если параметры существуют, это всегда -XXXили --CCCCтак, если вы введете ./или полный путь -rfне может рассматриваться как параметр и будет рассматриваться как обычная строка.

Работает со "всеми" странными именами файлов.

#pwd
/ TMP / TEST
#touch ./-rf
#ls 
-rf
#rm ./-rf 
#ls
#

1

rm - -rf большинство инструментов GNU принимают - как маркер конца опций

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