Какую команду мне нужно использовать, чтобы удалить файл с именем `-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.