67

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

Я пробовал:

rm "-rf"
rm \-rf

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

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

12 ответов12

127
unlink -rf

Или же

rm -- -rf
60

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

rm ./-rf

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

34

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

vim .

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

25

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

 ls -li

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

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

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

17

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

9

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

 mv -- -rf remove.-rf
 [[check]]
 rm remove.-rf
4

На всякий случай, если вы работаете в Unix, отличном от GNU, где вы чувствуете, что возвращаетесь к каменному веку (нет -- синтаксис, нет -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
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).

2

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

питон

импорт ОС

os.remove("- ВЧ")

1

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

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

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

#pwd
/tmp/TEST
#touch ./-rf
#ls 
-rf
#rm ./-rf 
#ls
#
1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .