Cara tercepat untuk menghapusnya dari direktori tersebut adalah dengan memindahkannya dari sana, setelah itu hapus saja di latar belakang:
mkdir ../.tmp_to_remove
mv -- * ../.tmp_to_remove
rm -rf ../.tmp_to_remove &
Ini mengasumsikan bahwa direktori Anda saat ini bukan tingkat teratas dari beberapa partisi yang terpasang (yaitu ../.tmp_to_remove
berada di sistem file yang sama).
--
setelah mv
(seperti yang diedit oleh Stéphane) diperlukan jika Anda memiliki nama file/direktori yang diawali dengan -
.
Di atas menghapus file dari direktori Anda saat ini dalam sepersekian detik, karena tidak harus menangani subdirektori secara rekursif. Penghapusan pohon yang sebenarnya dari sistem file membutuhkan waktu lebih lama, tetapi karena tidak memungkinkan, efisiensi sebenarnya seharusnya tidak terlalu menjadi masalah.
rsync
sangat cepat dan sederhana. Anda harus membuat direktori kosong terlebih dahulu,
mkdir emptydir rsync -a --delete emptydir/ yourdirectory/
yourdirectory/
adalah direktori tempat Anda ingin menghapus file.
Satu masalah dengan rm -rf *
, atau padanannya yang lebih tepat rm -rf -- *
adalah bahwa shell pertama-tama harus mencantumkan semua file (tidak tersembunyi) di direktori saat ini, mengurutkannya dan meneruskannya ke rm
, yang jika daftar file di direktori saat ini besar akan menambahkan beberapa overhead tambahan yang tidak perlu, dan bahkan bisa gagal jika daftar file terlalu besar.
Biasanya, Anda akan melakukan rm -rf .
sebagai gantinya (yang juga akan bermanfaat untuk menghapus file tersembunyi juga). Tapi kebanyakan rm
implementasi termasuk semua yang sesuai dengan POSIX akan menolak untuk melakukan itu. Alasannya adalah bahwa beberapa shell (termasuk semua yang POSIX) memiliki kesalahan fitur yang diperluas dari .*
glob akan menyertakan .
dan ..
. Yang artinya rm -rf .*
akan menghapus direktori saat ini dan induk, jadi rm
telah dimodifikasi untuk mengatasi kesalahan fitur dari shell tersebut.
Beberapa shell seperti pdksh
(dan turunan shell Forsyth lainnya), zsh
atau fish
tidak memiliki kesalahan fitur itu. zsh
memiliki rm
bawaan yang dapat Anda aktifkan dengan autoload zsh/files
itu, sejak zsh
.*
tidak termasuk .
maupun ..
bekerja dengan baik dengan rm -rf .
. Jadi di zsh
, Anda dapat melakukan:
autoload zsh/files
rm -rf .
Di Linux, Anda dapat melakukan:
rm -rf /proc/self/cwd/
untuk mengosongkan direktori saat ini atau:
rm -rf /dev/fd/3/ 3< some/dir
untuk mengosongkan direktori arbitrer.
(perhatikan /
di belakangnya )
Pada sistem GNU, Anda dapat melakukan:
find . -delete
Sekarang, jika direktori saat ini hanya memiliki beberapa entri dan sebagian besar file berada di subdirektori, itu tidak akan membuat perbedaan yang signifikan dan rm -rf -- *
mungkin akan menjadi yang tercepat yang bisa Anda dapatkan. Diharapkan untuk rm -rf
(atau apa pun yang menghapus setiap file) menjadi mahal karena berarti membaca konten semua direktori dan memanggil unlink()
pada setiap entri. unlink()
itu sendiri bisa sangat mahal karena melibatkan modifikasi inode file yang dihapus, direktori yang berisi file, dan beberapa peta sistem file atau area lain yang bebas.
rm
dan find
(setidaknya implementasi GNU) sudah mengurutkan daftar file berdasarkan nomor inode di setiap direktori yang dapat membuat perbedaan besar dalam hal kinerja pada sistem file ext4 karena mengurangi jumlah perubahan pada perangkat blok yang mendasarinya saat berturut-turut (atau menutup satu sama lain) inode dimodifikasi secara berurutan.
rsync
mengurutkan file berdasarkan nama yang dapat secara drastis mengurangi kinerja kecuali urutan nama kebetulan cocok dengan urutan by-inum (seperti saat file telah dibuat dari daftar nama file yang diurutkan).
Salah satu alasan mengapa rsync
mungkin lebih cepat dalam beberapa kasus adalah tampaknya tidak mengambil tindakan pencegahan keamanan untuk menghindari kondisi balapan yang dapat menyebabkannya turun ke direktori yang salah jika direktori diganti dengan symlink saat berfungsi seperti rm
atau find
lakukan.
Untuk mengoptimalkan sedikit lebih jauh:
Jika Anda mengetahui kedalaman maksimum pohon direktori, Anda dapat meneruskannya ke find
:
find . -maxdepth 3 -delete
Itu menghemat find
harus mencoba dan membaca isi direktori pada kedalaman 3.