GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Rm -r Melakukan Penghapusan Secara Rekursif? Dalam Urutan Apa?

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.


Linux
  1. Apa itu NGINX? Bagaimana cara kerjanya?

  2. Apa itu Server Web, dan Bagaimana Cara Kerja Server Web?

  3. Apa?

  1. Apa itu DNS dan Bagaimana Cara Kerjanya?

  2. Bagaimana kernel Linux menentukan urutan panggilan __init?

  3. Cara mengetahui file apa yang ada di sektor tertentu

  1. Apa itu Makefile dan bagaimana cara kerjanya?

  2. Bagaimana cara mengetahui apa yang dilakukan perintah Linux

  3. Apa yang dilakukan kill -- -0?