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

Другой вариант:

rm ./-rf

... если ваш текущий каталог является тем, где находится файл.

Мартин Клейтон
источник
34

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

vim .

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

oadams
источник
5
хороший трюк! [Несколько бесполезных символов]
Серхио Акоста,
Я не думал, что это заслуживает отрицательных голосов, которые были у меня, когда я впервые увидел этот ответ сегодня днем, но у меня не было возможности проверить, vimбыл ли режим Dired. Понятно, что редактирование самого каталога в текстовом редакторе не рекомендуется и не возможно без реального экспертного прыжкового прыжка. Обратите внимание, что это emacsбудет работать, и по той же причине.
RBerteig
1
Дополнительные очки за умное использование Vim! :)
Пьер-Антуан ЛаФайет
приятно знать;)
schöppi
25

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

 ls -li

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

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

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

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

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

Heptite
источник
1
Он может вообще не иметь GUI, так что это может не сработать.
Вуфферс
12
Если это было глупо и неправильно, возможно, это заслуживает отрицательного ответа, но я не верю в отрицательный ответ на этот вопрос только потому, что он «может не сработать». Никакого вреда это не принесет.
JT.WK
4
Всегда есть полночный командир (или другие файловые менеджеры, основанные на curses) для тех, у кого нет X.
thomasrutter
9

Если вы просто хотите быть уверены:

 mv -- -rf remove.-rf
 [[check]]
 rm remove.-rf
январь
источник
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
Olfan
источник
Что делать, если ваша система даже не имеет find?
Ли Райан
Это было бы действительно зло. Увы, я еще не встречал установку Unix без нее. Можете ли вы дать мне указатель?
Олфан
Если подумать, мой ответ был бы более уместным, если бы вопрос задавался по поводу отказа сервера. Суперпользователи вряд ли имеют такую ​​же древнюю технику, о которой я говорю. И те, кто это сделает, научились помогать себе. ;-)
Олфан
+1, @Olfan, в твою защиту, кто-то, кто только сейчас сталкивается с устаревшим Unix в шкафу где-то, все еще нуждается в ресурсе, чтобы изучить советы и приемы от ...
RBerteig
3

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

rm -i -- -rf

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

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

\rm -i -- -rf

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

haylem
источник
2

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

rm -rf -- filename

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

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

rm -rf *

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

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

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

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

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

питон

импорт ОС

os.remove ( "- ВЧ")

Jono
источник
1

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

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

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

#pwd
/ TMP / TEST
#touch ./-rf
#ls 
-rf
#rm ./-rf 
#ls
#
Louis
источник
1

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

Konrads
источник