GNU/Linux >> Belajar Linux >  >> Linux

Apa cara tercepat untuk menghapus semua file &subfolder dalam direktori?

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.


Linux
  1. Apa Cara Terbaik Untuk Menghitung Jumlah File Dalam Direktori?

  2. Cara Tercepat Untuk Mengekstrak Iso?

  3. Dapatkan Semua File Tapi File Dalam Array – Bash?

  1. Bagaimana menemukan semua file yang jarang di Linux

  2. Hitung baris semua file di direktori Ubuntu

  3. Apa cara terbaik untuk mengirim sinyal ke semua anggota grup proses?

  1. Mengapa Rm Dapat Menghapus File Read-only?

  2. Apa cara teraman untuk mengosongkan direktori di * nix?

  3. Apa cara paling efisien untuk memindahkan sejumlah besar file yang berada dalam satu direktori?