Perintah apa yang harus saya gunakan untuk menghapus file bernama `-rf`?

67

Saya melakukan sesuatu yang gila di beberapa titik yang membuat file dipanggil -rfpada sistem file saya.
Sekarang saya tidak tahu cara menghapusnya ...

Saya sudah mencoba:

rm "-rf"
rm \-rf

Ini segera keluar, arrgh!

Adakah yang tahu cara menghapus file ini? Lebih disukai tanpa sengaja membersihkan seluruh folder saya.

Pierre-Antoine LaFayette
sumber
33
Beberapa orang mencoba rmfile yang dipanggil -rfdari sistem Anda tanpa mengingat sintaks yang tepat!
ChristopheD
3
Untuk menjelaskan mengapa itu tidak berhasil: Kutipan dan pelolosan diuraikan oleh shell Anda (biasanya bash), dan kemudian hasil penguraian diteruskan ke rm(di dalamnya argcdan argv) Dengan demikian, kedua hasil dalam array ["rm", "-rf"]dilewatkan ke rm, yang melakukan apa yang Anda harapkan.
Thanatos
3
Saya pikir ini lebih dekat dengan duplikat yang satu ini dari Unix dan Linux stackexchange
frabjous
12
Gag lama adalah untuk mendapatkan file bernama *ke folder. Sertakan satu nama -rfjuga dan saksikan kesenangan ;-)
RBerteig
@RBerteig: mkdir './-rf '(ls --classify, default umum dalam alias shell, akan menambahkan a)

Jawaban:

127
unlink -rf

Atau

rm -- -rf
Josh Lee
sumber
47
Ini adalah solusi yang paling berguna untuk mempelajari IMO, karena '-' untuk menghentikan pemrosesan argumen distandarisasi di seluruh perangkat GNU
Nathan O'Sullivan
1
Untuk lebih tepat, apa-apa menggunakan GNUgetopt memiliki --, yang seharusnya berarti alat linux yang paling modern.
Geoffrey Zheng 6-10
60

Pilihan lain:

rm ./-rf

... mengasumsikan direktori Anda saat ini adalah di mana file berada.

martin clayton
sumber
34

Atau Anda selalu dapat mengedit direktori dan menghapus file dengan cara itu.

vim .

dan kemudian cukup hapus baris dengan file di dalamnya (menggunakan D, dd tidak akan berfungsi).

oadams
sumber
5
trik yang bagus! [Beberapa karakter yang tidak berguna]
Sergio Acosta
Saya tidak berpikir ini layak untuk downvotes ketika saya pertama kali melihat jawaban ini sore ini, tetapi saya tidak memiliki kesempatan untuk memverifikasi bahwa vimmemiliki mode dired. Jelas, mengedit direktori aktual itu sendiri dalam editor teks tidak dianjurkan, atau mungkin tanpa hoop jumping ahli nyata. Perhatikan bahwa itu emacsakan berhasil juga, dan untuk alasan yang sama.
RBerteig
1
Poin ekstra untuk penggunaan Vim yang cerdas! :)
Pierre-Antoine LaFayette
senang tahu;)
schöppi
25

Teknik umum untuk menghapus nama file aneh adalah menggunakan.

 ls -li

untuk menemukan nomor file inode dan kemudian gunakan.

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

Tidak perlu mengingat semua kasus khusus.

pengguna51427
sumber
4
Tidak tahu findpunya kekuatan untuk menghapus file.
zneak
Ini juga bagus untuk menangkap file dengan nama yang tidak dikenal (dimulai dengan atau termasuk karakter backspace atau memiliki spasi kosong di bagian akhir), asalkan Anda memiliki akses ke temuan GNU yang layak pada kotak Anda.
Olfan
17

Meskipun saya tahu tentang trik "rm - -filename", umumnya ketika saya entah bagaimana mendapatkan file dengan leading - dalam namanya yang ingin saya hapus, saya memulai file manager GUI dan melakukannya dari sana, untuk menghilangkan peluang. kesalahan.

Heptite
sumber
1
Dia mungkin tidak memiliki GUI sama sekali, jadi ini mungkin tidak berfungsi.
Wuffers
12
Jika itu bodoh dan salah, mungkin itu layak untuk downvote, tapi saya tidak percaya downvoting jawaban ini hanya karena itu 'mungkin tidak berhasil'. Tidak ada ruginya saran ini.
JT.WK
4
Selalu ada komandan tengah malam (atau manajer file berbasis kutukan lainnya) untuk mereka yang tidak X.
thomasrutter
9

Jika Anda hanya ingin memastikan:

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

Jika Anda berada di Unix non-GNU di mana Anda merasa diri Anda ditarik kembali ke zaman batu (tidak ada --sintaks, tidak ada -inumsaklar untuk menemukan, tidak ada perintah tautan, editor Anda menolak mengedit direktori dll.) Anda masih dapat membantu diri Anda sendiri:

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

Ini akan menyebabkan find memberi makan semua kandidat potensial ke rm yang pada gilirannya akan meminta izin / penolakan untuk setiap file yang diumpankan.

Jika Anda rmbahkan tidak mendukung -isakelar (HP-UX 10.2 pada PA-RISC 1.1, siapa pun?), Lebih berhati-hatilah:

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
sumber
bagaimana jika sistem Anda bahkan tidak punya find?
Lie Ryan
Itu memang jahat. Sayangnya, saya belum menemukan instalasi Unix tanpa instalasi. Bisakah Anda memberi saya sebuah pointer?
Olfan
Memberikan beberapa pemikiran, jawaban saya akan lebih tepat jika pertanyaan diajukan pada serverfault. Pengguna Super tidak mungkin memiliki mesin sekitar yang kuno seperti yang saya maksudkan. Dan mereka yang melakukannya akan belajar untuk membantu diri mereka sendiri. ;-)
Olfan
+1, @Olfan, dalam pembelaanmu, seseorang yang baru saja bertemu dengan warisan unix di dalam lemari di suatu tempat masih membutuhkan sumber daya untuk mempelajari tips dan trik dari ...
RBerteig
3

Mendukung jawaban jleedev , saya akan meningkatkan dengan:

rm -i -- -rf

untuk berada dalam mode interaktif dan meminta konfirmasi, sehingga Anda benar-benar yakin dengan apa yang Anda hapus. (Meskipun solusinya baik-baik saja. Ini hanya untuk ketenangan pikiran Anda)

Sebenarnya, bahkan gunakan itu:

\rm -i -- -rf

untuk memastikan bahwa Anda tidak menggunakan alias apa pun.

haylem
sumber
2

Seperti yang sudah disarankan saya selalu menggunakan sintaks

rm -rf -- filename

ketika saya harus menghapus file dengan tanda hubung sebagai awalan karena - mengatakan pada perintah bahwa ia tidak mencari parameter lain tetapi hanya nama file.

Dengan mengingatnya, untuk melindungi folder penting saya dengan penghapusan file yang tidak disengaja, saya digunakan untuk membuat file kosong bernama -i yang biasanya diletakkan di bagian atas daftar file ketika menyelesaikan pencarian *. Jadi perintahnya

rm -rf *

ketika dieksekusi pada folder yang dilindungi saya meledak, selama eksekusi, dalam perintah:

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

dan shell, alih-alih menghapus semuanya dengan segera, berhenti meminta konfirmasi (seperti opsi -i mengharuskan).

Ghidello
sumber
+1 untuk -iperetasan nama file - "Saya" skeptis, tetapi tes!
rymo
2

Terakhir kali saya mengalami masalah ini, saya menyelesaikannya dengan:

ular sanca

impor os

os.remove ("- rf")

Jono
sumber
1

martin clayton benar.

Ini sangat sederhana dan logis. Jika opsi ada itu selalu -XXXatau --CCCCbegitu jika Anda meletakkan ./atau path lengkap -rftidak dapat dianggap sebagai opsi dan akan dianggap sebagai string normal.

Ini bekerja dengan "semua" nama file aneh.

#pwd
/ tmp / TEST
#touch ./-rf
#l 
-rf
#rm ./-rf 
#l
#
Louis
sumber
1

rm - -rf kebanyakan alat gnu menerima - sebagai penanda akhir opsi

Konrads
sumber