Di Unix, bagaimana Anda menghapus semua yang ada di direktori saat ini dan di bawahnya?

Jawaban:

166

Praktikkan komputasi yang aman. Cukup naik satu tingkat dalam hierarki dan jangan gunakan ekspresi karakter pengganti:

cd ..; rm -rf -- <dir-to-remove>

Kedua tanda hubung tersebut --menyatakan rmbahwa <dir-to-remove>ini bukanlah opsi baris perintah, bahkan jika itu dimulai dengan tanda hubung.

tvanfosson.dll
sumber
8
Mengapa ini lebih aman?
Yen
34
Karena Anda secara khusus mencocokkan direktori bernama dan dengan demikian kecil kemungkinannya untuk menghapus sesuatu yang tidak ingin Anda hapus.
tvanfosson
5
Benar. Saya bisa melihat diri saya melakukannya dengan cukup mudah.
Yen
26
bukankah itu menghapus direktori itu sendiri juga? Anda harus melakukan mkdir <dir-to-remove> sesudahnya. Tetapi kemudian setiap hardlink yang merujuk ke direktori itu akan menjadi direktori yang berbeda setelahnya.
Johannes Schaub - litb
5
@Yen, jika Anda menggunakan rm ./Anda mungkin tidak sengaja mengetik rm . /yang bisa menjadi bencana.
irfandar
44

Akan menghapus semua file / direktori di bawah yang sekarang.

find -mindepth 1 -delete

Jika Anda ingin melakukan hal yang sama dengan direktori lain yang namanya Anda miliki, Anda cukup menamainya

find <name-of-directory> -mindepth 1 -delete

Jika Anda ingin menghapus tidak hanya sub-direktori dan file-nya, tetapi juga direktori itu sendiri, hilangkan -mindepth 1. Lakukan tanpa -deletemendapatkan daftar hal-hal yang akan dihapus.

Johannes Schaub - litb
sumber
Saya perlu menghapus semua file di sub-direktori, tetapi tidak ingin menghapus sub-direktori itu sendiri. temukan <name-of-direcotry> -mindepth 2 -hapus berhasil dengan baik!
Tim Dearborn
Anda perlu -mindepth 1jika Anda menentukan direktori ( find <name-of-directory> -mindepth 1 -delete). Jika tidak, Johannes benar, ia tidak akan menghapus direktori kerja saat ini (saat menggunakan find -delete).
Weboide
IMO, ini adalah jawaban terbaik, terutama dalam skrip.
wizonesolutions
1
Saya mencoba: find -mindepth 1 -deletetetapi saya mendapatkannya illegal option -- mtetapi berhasil dengan baik ketika saya menghapus opsi mindepth find . -delete
sharon
41

Yang selalu saya lakukan adalah mengetik

rm -rf *

dan kemudian tekan ESC- * , dan bash akan memperluas * ke daftar eksplisit file dan direktori di direktori kerja saat ini.

Manfaatnya adalah:

  • Saya dapat meninjau daftar file yang akan dihapus sebelum menekan ENTER.
  • Riwayat perintah tidak akan berisi "rm -rf *" dengan karakter pengganti utuh, yang kemudian dapat digunakan kembali secara tidak sengaja di tempat yang salah pada waktu yang salah. Sebaliknya, sejarah perintah akan memiliki nama file yang sebenarnya di sana.
  • Ini juga menjadi berguna sekali atau dua kali untuk menjawab "tunggu sebentar ... file mana yang baru saja saya hapus?". Nama file terlihat di buffer scrollback terminal atau riwayat perintah.

Sebenarnya, saya sangat menyukai ini sehingga saya menjadikannya sebagai perilaku default untuk TAB dengan baris ini di .bashrc:

bind TAB:insert-completions
Ville Laurikari
sumber
Hilang --dalam jawaban ini? Pendekatan ini luar biasa secara keseluruhan harus saya katakan.
Ben Voigt
cara yang lebih baik adalah menjalankan ini dengan sudo
Abbas Torabi
22

Menggunakan

rm -rf *

Pembaruan: .Singkatan dari direktori saat ini, tetapi kami tidak dapat menggunakan ini. Perintah tersebut tampaknya memiliki pemeriksaan eksplisit untuk .dan ... Gunakan wildcard globbing sebagai gantinya. Tapi ini bisa berisiko.

Versi IMO yang lebih aman digunakan:

rm -ri * 

(ini meminta Anda untuk konfirmasi sebelum menghapus setiap file / direktori.)

dirkgently
sumber
13
"Bisa berisiko" sangat singkat.
5
Ketika melakukan hal-hal seperti ini, saya menemukan ls -r cepat. pertama memungkinkan Anda melihat apa yang akan Anda hapus. Berguna untuk memberikan gambaran cepat bahwa Anda tidak akan menghapus seluruh disk ...
Rich Bradshaw
2
Mengapa lebih berisiko daripada rm -rf <subdir-name>?
Yen
2
@Yen - karena jika Anda melakukannya di tempat yang salah, Anda bisa mendapatkan hasil yang menghancurkan. Menggunakan nama tertentu di tempat yang salah hanya akan menimbulkan masalah jika ada subdirektori yang sama di sana.
tvanfosson
1
Anda tidak mungkin menghapus orang tua saat tinggal di dalam anak.
dirkgently
6

Benar bahwa rm –rf .akan menghapus semua yang ada di arus secara langsung termasuk semua subdirektori dan isinya. Titik tunggal ( .) berarti direktori saat ini. hati-hati jangan lakukan rm -rf ..karena tanda titik ganda ( ..) berarti direktori sebelumnya.

Ini dikatakan, jika Anda seperti saya dan memiliki beberapa jendela terminal terbuka pada saat yang sama, Anda sebaiknya aman dan menggunakan rm -ir .Mari kita lihat argumen perintah untuk memahami alasannya.

Pertama, jika Anda melihat rmhalaman manual perintah (di man rmbawah sebagian besar Unix) Anda melihat itu –rberarti "hapus isi direktori secara rekursif". Jadi, melakukan rm -r .sendiri akan menghapus semua yang ada di direktori saat ini dan semua yang ada di bawahnya.

Dalam rm –rf .penambahan -f berarti "abaikan file yang tidak ada, jangan pernah meminta". Perintah itu menghapus semua file dan direktori di direktori saat ini dan tidak pernah meminta Anda untuk mengonfirmasi bahwa Anda benar-benar ingin melakukannya. -fsangat berbahaya jika Anda menjalankan perintah di bawah pengguna hak istimewa karena Anda dapat menghapus konten direktori mana pun tanpa mendapat kesempatan untuk memastikan itu benar-benar yang Anda inginkan.

Sedangkan besarnya, di rm -ri .dalam -iyang menggantikan -fberarti "prompt sebelum penghapusan apapun". Ini berarti Anda akan mendapat kesempatan untuk mengatakan "oups! Bukan itu yang saya inginkan" sebelum rm dengan senang hati menghapus semua file Anda.

Pada hari-hari awal sysadmin saya, saya melakukan sebuah rm -rf /sistem sambil login dengan hak akses penuh (root). Hasilnya adalah dua hari berlalu pemulihan sistem dari cadangan. Itulah mengapa saya sekarang bekerja rm -risekarang.

Pierre-Luc Simard
sumber
6

Bagaimana tentang:

rm -rf "$(pwd -P)"/* 

sumber
27
jQuery sangat kuat.
Pawel
5
rm  -rf * 

Jangan lakukan itu! Itu berbahaya! PASTIKAN ANDA BERADA DI DIREKTUR YANG TEPAT!

nkassis
sumber
4

membuat yakin Anda berada di direktori yang benar

rm -rf *
digitaljoel.dll
sumber
2
Ini tidak menghapus file atau subdirektori yang namanya dimulai dengan titik.
1
benar. dalam pengujian saya, begitu pula rm -rf. tvanfosson memiliki IMO solusi terbaik dengan "cd ..; rm -rf <dir-to-remove>"
digitaljoel
2

Solusi paling aman & umum yang paling sederhana ini mungkin:

find -mindepth 1 -maxdepth 1 -print0 | xargs -0 rm -rf
devnev
sumber
1

Saya yakin jawaban ini lebih baik:

/unix/12593/how-to-remove-all-the-files-in-a-directory

Jika direktori level teratas Anda dipanggil images, jalankan rm -r images/*. Ini menggunakan operator shell glob *untuk dijalankan rm -rdi setiap file atau direktori di dalam gambar.

pada dasarnya Anda naik satu tingkat, dan kemudian berkata hapus semua yang ada di dalam direktori X. Dengan cara ini Anda masih menentukan folder mana yang harus dihapus isinya, yang lebih aman daripada hanya mengatakan 'hapus semuanya di sini ", sambil mempertahankan folder asli, (yang terkadang Anda inginkan karena Anda tidak diizinkan atau tidak ingin untuk mengubah izin folder yang ada)

Francisco Noriega
sumber