Rm -r tekrarlı bir şekilde nasıl kaldırılır? Hangi sırayla?


30

Operasyon sırası var mı rm? Ben gerçekleştirilen rmbüyük dizinde ve ben silinmiş olabilir görmek için bakmak gerekir nerede merak ediyorum. rmÖnce dosyalar, sonra dizinler üzerinde çalışır mı ? Yoksa inode tablosundaki bazı bilgilere dayanıyor mu?

Özellikler: GNU coreutils 8.22 sisteminden rm: Üzerinde çalışan beagleboneblack dosya sisteminde çalışan Linux, USB 2.0 kullanan harici bir Seagate HDD (ext4) idi.

backstory:

Dizin temizleme işlemi yaptım ve

cp -r A/ B/ C/ Dest/

Farkında olmadan, bunu takip ettim

rm -r A/ B/ C/ Dest/

basitçe gerçekleştirmek istediğimde

rm -r A/ B/ C/

Bunu yakaladım ve çok uzun zaman geçmeden Ctrl+ 'ya Cçarptım. Spesifik olarak, & timeile birlikte komutu kullandığımdan <3 saniye oldu . İçeri girdim ve var olmadığını umarak inceledim , ancak bakıldığında bütün olduğunu ve etkilenmediği görüldü . Bu oldukça küçük olduğu için biraz şaşırtıcı . Belki de toplam 100–200 MB. Ancak, sadece 1TB utangaç. Bir Deste gerçekleştirme / alfabenin her iki ucunda da dosya ve dizinlerin bulunduğunu göstermiştir (örneğin .... ).rmcpDest/A/ B/ C/Dest/lsAFile.txtZoo.txt

rmDest / dizine zarar vermeden önce şanslı mıydım ve iptal mi ettim ? rmGerçekten bu kadar yavaş mı (neyse ki!)?

Değilse, nasıl yok rmyinelemeli ben kaybolmuş olabilir ne olduğunu tahmin ki işler böyle kaldırma hakkında gitmek?

Gerçekten kaybedebileceğimi kurtarmayı beklemiyorum, sadece potansiyel olarak neyin atıldığını merak ediyorum.


Yanıtlar:


34

rm -rsırayla her bir argüman üzerinde çalışır. Bir argüman bir dizin ise, dizini listeler ( opendirve readdirişlevleriyle veya bazı eşdeğer yöntemlerle) ve sırayla her girişte çalışır. Bir giriş bir dizin ise, o girişi tekrar tekrar inceler.

- Bu diğer uygulamaların yinelemeli travers dizinlere kullandıkları aynı yöntemi find, ls -Rfvb

Geçiş sırası tahmin edilemez. Çoğu dosya sisteminde, dizin eklenmemiş, kaldırılmamış veya yeniden adlandırılmamışsa, düzen yeniden üretilebilir (sıra teoride her seferinde tamamen rasgele olabilir ve her seferinde değişebilir, ancak bunun gerçekleştiği bir dosya sistemini düşünemiyorum). Birkaç dosya sisteminde, sıra genel olarak dosya adlarından veya dosyaların oluşturulduğu sıradan veya her ikisinin bir kombinasyonundan çıkarılabilir, ancak dosya sisteminin ince ayrıntılarını bilmeniz gerekir; sürücü versiyonu. Geçiş sırası, güvenebileceğiniz bir şey değildir.

Bunları not edin lsveya echo *dosyaları kendi adlarının sözlük sırasına göre sıralayın. findve ls -fsıralama yapmayın.

Güvenebileceğiniz tek şey argümanların sırayla ele alınmasıdır. Bu yüzden C/, hala kısmen orada olsaydı, bunun Dest/el değmemiş olduğu anlamına gelirdi . Eğer bittiyse, dizin değiştirme zamanlarını kontrol ederek ve C/dosyaların silindiği zamanla veya kopyanın bittiği zamanı Dest/karşılaştırarak dosyaların nereye çıkarıldığı hakkında bir fikir edinebilirsiniz C/. İlk dosya doğrudan bir dosya olabilir silinecek Dest/ya da bir yere derin ilk giriş olmadığına bağlı hiyerarşide Dest/o rmtravers başına bir dizin oldu ya da değil.

Hızı rmçoğunlukla kaç tane dosyanın silineceği ile ilgilidir. Silme süresi üzerinde gözle görülür bir etkiye sahip olması çok büyük bir dosya gerektirir. Çalışmanın büyük kısmı sırayla her bir dizin girişini siliyor. Dosyanın verileri silinmez, bir dosyanın içeriğini silmek, yalnızca kullandığı blokları nispeten hızlı olan işaretlemek için yeterlidir.


2
-fSeçeneği lseşdeğer olarak belgelenmiştir -aUnerede, -aaraçlar tüm dosya ve listelemek -Usıralanmamış araçları. Belli belirsiz bir sürümünü karşılaşma hatırlamak lshangi -fama (ben başka bir şey olması tanımlandı düşünüyorum) işi yoktu -aUyaptı.
G-Man,

2
@ G-Man POSIX-f ( XSI uzantısı olarak ) tanımlar ; gerçekten sıralanmamış ötesinde başka etkileri var. V7'ye geri dönüyor, bu yüzden garip bir şekilde BusyBox dışında bir uygulama bulmamaya zorlanıyorsunuz. -Usıralanmamış, çünkü bir GNU özelliği, başka bir yerde olduğunu sanmıyorum.
Gilles 'SO- kötülük yapmayı kes'


@Tim Hayır ls -U. Bir dizinde çalıştırarak test edebilirsiniz . Bu, rm -rbu dizinde işe yarayacak aynı düzendir . Bir dosya eklemek veya kaldırmak, diğer dosyaların sırasını değiştirebilir.
Gilles 'SO- kötülük olmayı bırak'

Teşekkürler. (1) "bir dosyanın eklenmesi veya çıkarılması diğer dosyaların sırasını değiştirebilir.", Bu nedenle kazara kısmi kaldırma işleminden sonra, ls -Ukalan direklere dokunulup dokunulmadığını bulmak yardımcı olmaz mı? (2) -U "dizin sırasındaki girişleri listele" anlamına gelir. -U, dizindeki dizin girişlerinin sırası anlamına mı geliyor?
Tim

5

Gilles'un dediği gibi, genellikle bir dizindeki silme sırasını tahmin edemezsiniz, yalnızca üst düzey dizinlerin komut satırındaki sırayla işleneceğini belirtirsiniz.

Ancak, dizin hiyerarşilerini aşağıdan yukarıya sileceği de garanti edilir, çünkü Unix yalnızca dizinler boş olduğunda silinmesine izin verir. Bu yüzden bir dizini silmek için önce içindeki her şeyi silmek zorunda. Alt dizinler içeriyorsa, önce içeriğini, vb. Kaldırmak zorundadır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.