Apakah ada urutan operasi untuk rm
? Saya melakukan rm
pada direktori besar dan saya ingin tahu di mana saya harus mencari untuk melihat apa yang mungkin telah dihapus. Apakah rm
bekerja pada file terlebih dahulu, lalu direktori? Atau berdasarkan beberapa informasi di tabel inode?
Spesifikasi:rm dari GNU coreutils 8.22
sistem:Arch Linux yang berjalan pada sistem file beagleboneblack
yang beroperasi pada HDD Seagate eksternal (ext4) menggunakan USB 2.0.
Latar Belakang:
Saya sedang melakukan beberapa pembersihan direktori dan melakukan
cp -r A/ B/ C/ Dest/
Tanpa disadari, saya mengikutinya dengan
rm -r A/ B/ C/ Dest/
ketika saya bermaksud hanya melakukan
rm -r A/ B/ C/
Saya menangkap ini dan menekan Ctrl +C sebelum terlalu lama berlalu. Secara khusus, itu <3 detik karena saya menggunakan time
perintah dalam hubungannya dengan rm
&cp
. Saya masuk dan memeriksa Dest/
mengharapkannya tidak ada, tetapi lihatlah, itu utuh dan muncul untuk tidak terpengaruh. Ini sedikit mengejutkan karena A/
B/
C/
cukup kecil. Mungkin totalnya 100–200 MB. Dest/
Namun, hanya malu 1TB. Melakukan ls
pada Dest/ menunjukkan bahwa ada file dan direktori di kedua ujung alfabet (mis. AFile.txt
…. …. Zoo.txt
).
Apakah saya beruntung dan membatalkan rm
sebelum merusak direktori Dest/ saya? Apakah rm
benar-benar lambat (untungnya!)?
Jika tidak, bagaimana caranya rm
pergi tentang menghapus hal-hal secara rekursif sehingga saya bisa menebak apa yang mungkin hilang?
Saya tidak benar-benar berharap untuk memulihkan apa yang mungkin hilang, hanya ingin tahu apa yang berpotensi meledak.
Jawaban yang Diterima:
rm -r
bekerja pada setiap argumennya secara bergantian. Jika sebuah argumen adalah sebuah direktori, ia mencantumkan direktori tersebut (dengan opendir
dan readdir
fungsi atau beberapa metode yang setara), dan beroperasi pada setiap entri secara bergantian. Jika sebuah entri adalah direktori, entri tersebut akan mengeksplorasi entri tersebut secara rekursif.
Ini adalah metode yang persis sama yang digunakan aplikasi lain untuk melintasi direktori secara rekursif — find
, ls -Rf
, dll.
Urutan traversal tidak dapat diprediksi. Pada sebagian besar sistem file, urutannya dapat direproduksi selama tidak ada file yang ditambahkan, dihapus, atau diganti namanya dalam direktori (urutan secara teori dapat benar-benar acak dan berubah setiap saat, tetapi saya tidak dapat memikirkan sistem file di mana itu terjadi). Pada beberapa sistem file, urutannya secara umum dapat disimpulkan dari nama file atau dari urutan pembuatan file atau kombinasi keduanya, tetapi Anda perlu mengetahui detail halus dari sistem file, dan itu dapat bervariasi tergantung pada versi drivernya. Urutan traversal bukanlah sesuatu yang dapat Anda andalkan.
Terkait:Mengoptimalkan ukuran sektor logis untuk ukuran sektor fisik 4096 HDD?
Perhatikan bahwa ls
atau echo *
lakukan pengurutan file dalam urutan leksikografis dari namanya. find
dan ls -f
jangan diurutkan.
Satu hal yang dapat Anda andalkan adalah bahwa argumen ditangani secara berurutan. Jadi jika C/
sebagian masih ada, itu berarti Dest/
tidak tersentuh. Jika C/
hilang, Anda dapat mengetahui di mana file telah dihapus di Dest/
dengan memeriksa waktu modifikasi direktori dan membandingkannya dengan waktu C/
telah dihapus atau saat salinan berakhir. File pertama yang akan dihapus bisa berupa file langsung di Dest/
atau di suatu tempat jauh di dalam hierarki tergantung pada apakah entri pertama di Dest/
rm
itu kebetulan melintasi adalah direktori atau tidak.
Kecepatan rm
sebagian besar masalah berapa banyak file yang ada untuk menghapus. Dibutuhkan file yang sangat besar untuk memiliki dampak nyata pada waktu penghapusan. Sebagian besar pekerjaan menghapus setiap entri direktori secara bergantian. Data file tidak terhapus, menghapus konten file hanya perlu menandai blok yang digunakan sebagai gratis, yang relatif cepat.