Яку команду мені потрібно використовувати, щоб видалити файл з назвою `-rf`?


67

Я зробив щось божевільне в якийсь момент, що створив файл, який називається -rfу моїй файловій системі.
Тепер я не можу зрозуміти, як її видалити ...

Я спробував:

rm "-rf"
rm \-rf

Вони просто виходять негайно, arrgh!

Хтось знає, як видалити цей файл? Переважно без випадкового очищення всієї моєї папки.


33
Деякі нерви намагаються rmстворити файл, викликаний -rfз вашої системи, не запам'ятовуючи точний синтаксис!
ChristopheD

3
Щоб пояснити, чому вони не працюють: Цитати та втеча аналізуються вашою оболонкою (як правило, bash), а потім результат розбору передається rm(у ньому argcта argv). Таким чином, обидва ці результати призводять до ["rm", "-rf"]передачі масиву rm, що робить те, що ви очікували.
Танатос

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

12
Стара дана проблема - отримати файл, названий *у папці. Включіть також одного з названих -rfі спостерігайте за задоволенням ;-)
RBerteig

@RBerteig: mkdir './-rf '(ls --classify, загальний типовий псевдонім оболонки буде доданий a /)

Відповіді:


127
unlink -rf

Або

rm -- -rf

47
Це найкорисніше рішення для вивчення ІМО, оскільки "-" зупинити обробку аргументів стандартизовано в інструментах GNU
Натан О'Салліван

1
Щоб бути більш точним, все, що з допомогою GNUgetopt має --, що має означати найсучасніші інструменти Linux.
Джеффрі Чжен


34

Крім того, ви завжди можете редагувати каталог у ньому та видаляти файл таким чином.

vim .

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


5
приємний трюк! [Кілька непотрібних символів]
Серхіо Акоста

Я не вважав, що це заслуговує скорочення, яке воно було, коли я вперше побачила цю відповідь сьогодні вдень, але у мене не було можливості перевірити, чи vimбув увімкнений режим. Зрозуміло, що редагувати сам каталог у текстовому редакторі не рекомендується, ані неможливо без реальних стрибків експертних обручів. Зауважте, що emacsце також спрацювало б і з тієї ж причини.
RBerteig

1
Додаткові бали за розумне використання Vim! :)
П'єр-Антуан Лафайєт

приємно знати;)
schöppi

25

Загальна техніка для видалення дивних імен файлів - це використання.

 ls -li

щоб знайти номер файлу inode, а потім скористатися.

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

Не потрібно пам’ятати про всі особливі випадки.


4
Не знав, чи findмає право видаляти файли.
zneak

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

17

Незважаючи на те, що я знаю про трюк "rm - -namename", як правило, коли я якось отримую файл з провідним - на його ім'я, яке я хочу видалити, запускаю файловий менеджер GUI і роблю це звідти, щоб виключити шанс помилок.


1
Він може взагалі не мати графічного інтерфейсу, тому це може не спрацювати.
Wuffers

12
Якщо це було дурним і неправильним, можливо, воно заслуговує пониження, але я не вірю в те, щоб відмовитись від цієї відповіді лише тому, що вона "може не спрацювати". Жодної шкоди ця пропозиція не може принести.
JT.WK

4
Завжди є опівночі командир (або інші файлові менеджери на основі прокльонів) для тих, хто не має X.
thomasrutter

9

Якщо ви просто хочете бути впевненими:

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

4

На всякий випадок, якщо ви перебуваєте в якомусь не-GNU Unix, де ви відчуваєте, що ви повернулися до кам'яної доби (немає --синтаксису, немає -inumкомутатора, щоб знайти, не відключити команду, ваш редактор відмовляється від редагування каталогів тощо), ви все одно можете допомогти собі:

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

Це призведе до знаходження для подачі всіх потенційних кандидатів в 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, @ Ольфане, на ваш захист, хтось зараз стикається зі спадщиною Unix у шафі десь ще потрібен ресурс, щоб дізнатися поради та підказки з ...
RBerteig

3

Підтримуючи відповідь jleedev , я б покращив:

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злому файлу - "Я" був скептичним, але це перевіряється!
римо

2

Востаннє у мене була ця проблема, я вирішив її:

пітон

import os

os.remove ("- rf")


1

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

Це дуже просто і логічно. Якщо параметри існують, це завжди -XXXабо --CCCCтак, якщо ви ставите a ./або повний шлях -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.