Apa yang telah 'rm -r ~' lakukan pada direktori home saya?

17

gedit membuat file cadangan tersembunyi yang diakhiri dengan '~'. Saya ingin melakukan pembersihan rekursif dari pohon direktori saya.

Perintah rm *~akan menghapus semua file lokal yang diakhiri dengan '~'

Saya pikir rm -r *~ .akan menghapus semua file di seluruh pohon, tapi saya salah ketik rm -r ~.

Ada pesan beberapa direktori tidak dapat dihapus dan saya keluar dari perintah. Pertanyaannya adalah: Apa yang telah saya hapus?

Saya memang memperhatikan bahwa konfigurasi Filezilla saya hilang. Apakah perintah ini menghapus semua direktori tersembunyi dari direktori home?

GUI Junkie
sumber
4
Yah, setidaknya aku punya strategi cadangan ... Tidak ada kerugian nyata yang terjadi.
GUI Junkie
2
Senang mendengarnya; Saya memiliki kebijakan untuk tidak pernah menggunakan -rkecuali saya ingin menyingkirkan semuanya.
ish
3
Sebagai catatan, rm -r *~ .akan menghapus semua file dan folder (dalam direktori saat ini) yang cocok *~atau .. ( .akan diabaikan oleh rmsebagai pengecualian khusus, karena kebanyakan orang tidak ingin secara rekursif menghapus direktori saat ini. *~Menghapus semua file dan direktori dalam direktori saat ini yang berakhir dengan ~, tetapi bukan file dan direktori dalam subdirektori dari direktori saat ini. ) Jadi bukan itu yang Anda inginkan. Anda mungkin akan ingin menggunakan finddengan -execbendera untuk tampilan secara rekursif melalui pohon direktori dan non-rekursif menghapus setiap file berakhiran ~.
Eliah Kagan
@ ElliKagan, saya kira begitu, tetapi menemukan dengan -exec selalu merepotkan. Mengembalikan dir home lebih merepotkan, meskipun :-)
GUI Junkie
1
Informasi: nyanyikan ~karakter tanpa menghindarinya (seperti ini \~:) akan membuat Bash, ZSH, dll. ( rmPerintah pada dasarnya) mengira maksud Anda adalah direktori home.
Thomas Ward

Jawaban:

31

Anda telah menghapus (hampir) semua direktori home Anda!

rm -r something secara rekursif menghapus file dan direktori dalam / di bawah sesuatu ; itu hanya akan gagal pada item yang tidak memiliki izin untuk dihapus, baik karena mereka dimiliki oleh pengguna yang berbeda (misalnya root), atau karena mereka sedang digunakan (misalnya mount GVFS).

Jika Anda tidak menambahkan -f(seperti pada, rm -rf something), Anda akan mendapatkan sesuatu seperti:

rm: remove write-protected regular file something’?
rm: descend into write-protected directory something’?

Pada titik ini Anda dapat membatalkan dan kemudian menyadari bahwa Anda telah menjalankan perintah yang salah.

Saran dari masyarakat tentang cara menghindari kecelakaan semacam itu

Catatan: Komunitas wiki, semua orang silakan berkontribusi.

  • Untuk beberapa file, gunakan -iopsi untuk mendapatkan konfirmasi tentang menghapus file atau direktori:

    $ rm -ri something/
    rm: remove regular file something/file~’? y
    rm: descend into directory something’? y
    rm: remove regular file something/file’? y
    rm: remove directory something’? y
  • Jika menghapus dari direktori saat ini, awali dengan ./untuk menghindari kesalahan menghapus lokasi yang berbeda .:

    $ cd something
    $ rm -v ./*~
    removed ‘./file~’

    Di atas adalah untuk menunjukkan penggunaan ./. Jika ada subdirektori, tentu saja Anda dapat menggunakannya rm -v something/*~juga. Hati-hati : jangan berpikir bahwa rm ./.*menghapus semua file tersembunyi di direktori saat ini. Lihat pertanyaan Serverfault ini untuk pemecahan masalah pada file tersembunyi yang digulung.

  • Pindahkan daripada menghapus: Daripada menghapus file secara rekursif di tempat pertama saya terbiasa memindahkan file yang ingin saya singkirkan di tempat lain sebelum akhirnya saya menghapusnya. Jika terjadi kesalahan, mudah dipulihkan.

    mv -b SOURCE DEST
  • Gunakan find(mungkin dengan grep) untuk melihat pratinjau jika Anda ingin menghapus file yang dipilih secara rekursif. Anda harus mencoba membuat ini suatu kejadian yang jarang, tetapi jika Anda harus ...

    1. findtanpa argumen secara rekursif mendaftar semua file / direktori di bawah yang sekarang. Anda harus mencoba mencari man findcara membuatnya selektif (harta karun), tetapi jika Anda tidak ingin repot, Anda bisa menggunakan familiar grepuntuk memfilter file yang ingin Anda hapus.
    2. Misalkan saya adalah peretas kernel uber-l33t, dan saya terganggu oleh beberapa KB "contoh" file di pohon sumber saya; Saya ingin menghapus semua file yang berisi nama itu. Jadi saya ketik find | grep example, yang memberi saya 20 file ini. Itu terlihat bagus, jadi saya sekarang pergi dan menghapus file-file yang tepat, bersama dengan rm -voutput verbose yang disebutkan sebelumnya, melalui xargs:
      temukan | grep example | xargs rm -v
      yang memberi saya hasil ini. Pratinjau seperti mencegah masalah di mana mengatakan, Anda membuat kesalahan ketik dan samplebukan example.

Solusi di atas tidak boleh digunakan jika Anda mungkin memiliki nama file yang mengandung spasi, karakter tab, baris baru, atau tanda kutip ( "atau '), karena ini akan menyebabkan xargskegagalan, atau memberi makan rmdengan nama file yang tidak lengkap, yang dalam kasus terburuk bisa berakhir dengan menghapus yang salah file. Cara aman untuk melakukan hal di atas adalah melakukan semuanya dengan findoperator dan tindakan.

Berikut ini akan menampilkan semua file yang berisi kata example

find . -name "*example*"  

Jika daftar itu adalah file yang ingin Anda hapus, gunakan -exectindakan untuk meneruskan file rm.

find . -name "*example*" -exec rm -v {} +

Lihat Menggunakan Temukan untuk bantuan lebih lanjut tentang penggunaan find.

Lekensteyn
sumber
1
pipa findoutput ke grepdan xargs rmberbahaya.
geirha
2
@izx: ditambahkan mv(perintah favorit saya);)
Takkat
1
Saya setidaknya akan menambahkan contoh menggunakan findcara aman, yang tidak merusak (dan berpotensi menghapus file yang salah) jika nama file mengandung spasi, tab, baris baru, "atau 'karakter. Misalnya find . -name "*example*" -exec rm -v {} +. mywiki.wooledge.org/UsingFind
geirha
1
@geirha: mengapa find -deletebegitu berbahaya? Saya akan mengatakan sesuatu di sini tapi saya tidak tahu selain yang baru-baru ini ditemukan dan dihapus saya /meskipun berjalan kering tanpa opsi -deletehanya menemukan beberapa file yang ingin saya hapus. Saya melihat bahwa Anda merekomendasikan -exec rmsebagai gantinya.
Takkat
3
@Takkat -deletetidak berbahaya, dan Anda dapat dengan aman menggunakannya bukan -exec rm {} +. Saya biasanya lebih suka menggunakan alat dan fitur standar bila memungkinkan. -deleteadalah ekstensi GNU yang tidak standar, jadi ekstensi findini akan berfungsi dengan baik di Ubuntu, tetapi mungkin tidak pada sistem lain.
geirha
5

Iya. Karakter tilde yang tidak dikutip sebagai argumen terpisah akan diperluas ke homedir Anda. Jadi rm -r ~diperluas ke rm -r /home/yourusename. Jadi, Anda memberi tahu rm untuk menghapus semua file di homedir Anda secara rekursif.

Lihat http://www.gnu.org/software/bash/manual/bashref.html#Tilde-Expansion untuk informasi lebih lanjut tentang cara kerja ekspansi tilde.

geirha
sumber