Linux bir hareket komutunu nasıl işler?


12

Linux kaputun altında bir hareket komutunu nasıl işler?

Diyelim ki evimi taşıyorum dir

/home/me

ve bunu başka bir dizine taşıyorum

/home/foo/me

Altındaki tüm dosya ve dizin yolları nasıl medeğiştirilir? Benim Desktopdir altında meşimdi /home/foo/me/Desktopde biliyorum Documents /home/foo/me/Documentsama dosya sistemi açıkça medeğişikliği yansıtmak için altında her yolu güncelleştirir mi? Bu kulağa çok verimli gelmiyor ve muhtemelen bu değil.

Bununla ilgili daha fazla bilgiyi nereden alabilirim?


5
Verimlilik hakkında: hayır, bu verimli olmaz. Verileri başka bir dizine taşıdığınızda, veriler gerçekte bir yerde okunmaz ve başka bir yere yazılmaz. Bir dosya sistemi, veri bloklarına bir dizi işaretçi içerir. Bir hareket durumunda, sadece işaretçiler güncellenir.
Jos

Ah, muhtemelen
jeff'in

@Jos Parçalanma nereden geliyor?
zero298 13:14

3
@ zero298 Hayır, fragmantasyon genellikle tamamen farklı ve ilgisiz bir isse - fragmantasyon klasör yapısının içeriği ile ilgili değil, tek bir dosyanın içeriği (tek bir sürekli satır olmak yerine) fiziksel disk plakalarına dağılmış (okunan tek bir satır yerine) / bu tür dosyaların performansını yazar. Büyük / derin / dallanan klasör ağaçlarının içeriğinin genellikle sürekli olması ve bu şekilde hareket etmesi beklenmez.
Peteris

Yanıtlar:


21

Klasörleri nasıl taşıdığını anlamak için linux altındaki dosya sistemi hakkında biraz bilgi sahibi olmanız gerekebilir. Her dosya ve klasör " inode " adı verilen veri yapısının bir parçası olarak saklanır . Her dosyanın bir inode numarası vardır, klasörler de.

Klasörünüzün inode'unu görüntülemek için komutu kullanın ls -ial foldername. İlk sütun dosyanın inode numarasını gösterir. Her klasör için iki benzersiz ad vardır .ve ..sırasıyla kendi dizinini ve üst dizini temsil eder.

Alt dizinleri ve dosyaları olan bir dizini (örneğin, / home / me / source) başka bir dizine (ör. / Home / me / somewhere / else) taşımak için bir deneme yapmayı deneyebilirsiniz. / Home / me / kaynağının inode numarası ve tüm içeriği taşınmadan önce ve sonra aynı kalır. Tek fark, ..başlangıçta / home / me inode numarasını paylaşan ve şimdi / home / me / bir yerlerde / else inode numarası haline gelen inode numarasıdır. Basit bir ifadeyle, Linux dizin kaynağına bağlantıyı günceller ve sonra yapılır.

Sabit diskteki içerik yine de değiştirilmez, sadece klasör taşındığında inode dizini güncellenir. Tabii ki, klasörü farklı bir fiziksel konuma taşırsanız durum böyle değildir.


3
Doğru, taşıma dosya sistemi sınırlarını geçmediği sürece.
kojiro

3

Nasıl programlarda gibi ilgi ediyorsanız mvve cpişi, bu onların ediyoruz açık kaynak hatırlamak ve kod okuyarak en doğru açıklama elde edebilirsiniz. Burada tüm temel yardımcı programlara bağlantılar vardır. Özellikle, burada mv bulabilirsiniz


6
you can get the most accurate explanation by reading through the code.Naçizane size katılmıyorum; Uzun bir süre boyunca C ile hiçbir deneyimim yoktu ve şimdi bile tercih etmiyorum. Ayrıca, kaynak kodu genellikle optimize edilir ve gereğinden fazla kenar durumu içerir. Sembolik bir açıklama genellikle daha fazla yardımcı olur.
Shelvacu

1
@shelvacu "gereğinden fazla kenar durumu içeriyor". Sağlam kod , var olabilecek tüm kenar durumlarını işler . Ancak, bir kavramın ilk açıklamasında tüm uç durumların sunulmasının gerekli olmayabileceği doğrudur.
OregonTrail

@OregonTrail Üzgünüm demek istediğim, kod daha fazla kenar durumda daha sonra bir açıklama ihtiyacı vardır
Shelvacu 15:14

Bunun orijinal hissiniz olduğuna sevindim, ama yine de " tutamaklar " vurgumu kaçırmış gibisiniz . İyi yazılmış kodun kenar durumları yoktur , kenar durumlarını işler . ;) Burada doğru yerden geldiğini biliyorum, ama fiillerine dikkat etmelisin.
OregonTrail
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.