Sabit bağlantı oluşturulursa hangi dosyanın orijinal olduğu nasıl anlaşılır


34

Mesela bir dosyam var myold_file. Sonra aşağıdaki lngibi sert bir bağlantı oluşturmak için kullanın mylink:

ln myold_file mylink

Sonra bile ls -a, hangisinin eski olduğunu söyleyemem.

Söylenecek bir şey var mı?


2
Karşı Sorgulama: Yaparsanız ls > a; ln a b; rm a; ln b c, hangisi diğerinden daha "orijinal"? agitti, sen kaldı bve c...
glglgl

2
Neyi başarmaya çalışıyorsun? Neyi başarmaya çalışıyorsun? Böyle bir "orijinal" yoktur. Bir dosya meta veri içeren bir inode ve veri içeren bir bloklar topluluğudur. Bir dizin dosyaya bir bağlantı içerebilir ve bu bağlantı dosya adı ve inode numarasıdır. Bir dosyaya istediğiniz sayıda bağlantı oluşturabilirsiniz. Dosyalarda hiçbir zaman birden fazla bağlantı olamaz.
Johan

Bu sorunun kabul cevabın ayrıntılı bir açıklama için: karsi kabul yanıta bakın bu soruya .
Utku

Yanıtlar:


93

Bunu yapamazsınız, çünkü bunlar tam anlamıyla aynı dosyadır, ancak farklı yollarla ulaşılır. İlki özel bir statüye sahip değil.


4
Bu açıkça doğru cevaptır: OP'nin sorusu bir yanlış anlaşılmaya dayanıyor.
Daniel Earwicker

8
@Adnan Aslında, hayır: iki sabit bağlantı aynı dosyadır. Farklı dizin girişleri. Jenny D'nin terminolojisi doğru.
Gilles 'SO- kötülük' dur

1
@Gilles Nasıl doğru olabileceğini anlamıyorum. İki sabit bağlantı iki dosya değildir ; Sabit bağlantılar dosya değildir. Bunlar işaret dolayısıyla bağlantı (diskte fiziksel konumunu olan) aynı dosyaya. "İki hard link tam anlamıyla aynı dosyadır" demek yanlıştır.
Adi

1
@JennyD Ve "hard link" kullanıldığını duymanın tek yolu bu; bir inode için bir dosya sistemi işaretçisi. Sanırım hepimiz hatalı ve haklıyız. Bunu anlamsız olduğu gibi tartışmayı bırakacağım. Cevabınız bana doğru geliyor, benden bir +1 değerine sahipsiniz ve ben de bunu bırakacağım.
Adi

5
Sabit bir bağlantının "bir dosya" olduğunu söylemek, teknik olarak yanlış olan farklı kategorilerdeki şeyleri karşılaştırmaktır. Ancak, genel olarak, " .bashrcgörece bir dosya olduğunu" söylediğimizde, " göreceli yol .bashrciçeren bir dosyaya atıfta bulunurken " derken, bunun kategorilerin ortak bir birleşimi olduğunu ve ne zaman bir ifade edildiğini anlamamız gerekir. bir yol veya bir dizin "dosya" dizinidir, başvurduğu dosyayı kastediyoruz. Bu anlayışla, iki hard link aynı dosya olabilir. Bu sözleşmeyi biçimsel dil lehinde reddederek yapamazlar. Her iki duruşun da kendi yerleri var :-)
Steve Jessop

16

Bunu yapmanın doğrudan, temiz (güvenilir) bir yolu yoktur. Ancak uygun koşullar altında bu mümkün olabilir (veya en azından mümkün olabilir). Sorun şu ki iki tane sabit link var ama sadece bir dosya var. Değişiklik, değiştirme ve (belki) oluşturma süresi sadece dosyalar (inode) için saklanır, ancak dizin girişleri (hard linkler) için saklanmaz. Böylece, istediğiniz bilgiler yalnızca dosyayla ilgili olmayan işlemlerle kolayca yok edilebilecek ikincil etkilerden alınabilir. Ve tahrip edilip edilmediğini bile göremezsin. Bunu ancak operasyonel koşullardan tam olarak onların farkında olduğunuzda anlayabilirsiniz.

Bir sabit link oluşturulması, linki içeren dizine bir yazma işlemidir. Böylece müdürlüğün güncellenmesi mtime. Yani eğer

  1. bağlantılar farklı dizinlerde

  2. ikinci bir link oluşturulduktan sonra bu dizinlerden hiçbirinin değiştirilmediğini (dosya eklenmiş, silinmiş, yeniden adlandırılmış veya dosya meta verisi değiştirilmiş) biliyorsunuzdur, sonra mtimedizinleri kolayca karşılaştırabilirsiniz .

Özel durum: Dizinlerden birinin mtimedosyanın (inode) dizisinden önce bir dosyası mtimevarsa ve dosyanın oluşturulmasından kısa bir süre sonra yazılmadığından emin olabilirseniz, bu direktörün bağlantısı daha eskidir.

Bağlantılar aynı dizinde ise (bu sorunuzla ilgili gibi görünüyor) o zaman daha da kötüleşiyor. Sonra kullanabilirsiniz

ls -lU

Girişlerin oluşturulduğu sıraya ilişkin bir izlenim elde etmek için. Girdiler silinebileceğinden doğru sıralamaya gerek yoktur, böylece dizin listesinin ortasında yeni girdiler yapılır. Ve Gilles'un belirttiği gibi, yeni dosya sistemleriyle hiç çalışmaz.


2
Selinux, denetim izleri ya da dosya günlüğü casusluğundan bahsetmek yok ??? smirk Denetim izi olmadan bilmenin yolu yok - başka bir şey hesaplanmış bir tahmin
Ricky Beam

1
@mikeserv Başkalarına bu şekilde öğretmek istiyorsanız, en azından doğru şekilde alıntı yapmayı öğrenmelisiniz. O mu değil söz konusu "hangi dosya" derler. Bunu yapsa bile, bu sadece bir ifade sorunu olacak ve soruyu anlamak için biraz beyin atmak, bunun gerçekten neyle ilgili olduğunu kolayca ortaya çıkaracaktır.
Hauke,

4
Koşullar doğruysa, mtime dizini çalışacaktır (nadirdir). Ancak, sunma şekliniz, bazen tam tersi bir sonuç çıkar. Mtime dizini, yalnızca dosyanın ctime değerine eşit olması durumunda değerli bir göstergedir. Fakat ls -lUpüf noktası modern dosya sistemlerinde (ext4, btrfs, zfs) işe yaramayacak, girişler oluşturma sırasına göre hiç görünmüyor.
Gilles 'SO- kötülük' dur

2
@mikeserv - OP'nin sorusu yanlış anlamaya dayanıyor. Eğer rm myold_fileöyleyse mylink, o zaman hala var olurlar ve mükemmel çalışırlar, çünkü aynı temel inode'a atıfta bulunan eşit derecede iyi bir girdidir. Sadece ikisi de silindiğinde, sistem inode'u atabilir. Aynı dosyaya atıfta bulunan iki dosya sistemi girişi oluşturmak için sert bir bağlantı kullanıldığında, bunlar eşdeğerdir. . ( "Dosya" burada "bir dizine yerine bir dosya için verileri tutan bir dosya düğümü anlamına gelir Not) Bkz: en.wikipedia.org/wiki/Inode
Daniel Earwicker

1
-1, tabloları güncellerken dizinin bazı dosya sistemlerinde nasıl değiştiğine ilişkin bilgilerde olsa da, bu cevap, "orijinal dosya" nın birden fazla bağlantı durumunda bir özellik olmadığı sorusundaki yanlış anlama anlayışını ortadan kaldıramaz tek bir inode'a Bu anlamda anekdot olarak ilginç olsa da, bu soruya inen insanların çoğu hardlinksin temel kavramı hakkında öğrenmeleri gereken şey bu değildir. Bu mesele "bunu yapmak için doğrudan temiz bir yol" eksikliği değildir, mesele, ilk başta "o" olmamasıdır .
Caleb

10

Dizinlerin son değişiklik zamanına güveniyorsanız ve bu dizinlerin nasıl ve ne zaman değiştirildiğine dair bilginiz yoksa, zamana bağlı kalmak, zamanın yanlış olmanıza yol açacaktır. Buradaki sorun, dosyanın dosya sisteminde bir dizin girişi tarafından değil bir inode ile temsil edilmesidir. Dizin girişi (dosya adı) dosyaya değil inode'a işaret eder.

Sanırım neden hangi dizin girişinin daha eski olduğunu bilmem gerektiğine ve bunu bilmek zorunda kalmamayı nasıl önemseyeceğime dair bir göbek bakışı yapacağımı düşünüyorum.


8

Bence bu soru (oldukça makul), gerçekte ne kadar zor bir bağlantı olduğu konusunda yanlış yönlendirilmiş. Bence en doğru doğrudan cevap “ikisi de” dir .

Unix dosya sistemleri normalde gerçek dosya içeriğini ve verilerini i-düğümlerinde depolar, bunların hiçbir yolu yoktur, o zaman yollar bu i-düğümlerle bir çok ilişkiye sahiptir. Benzetme yapmak için iki isimle giden bir kişi var, Bob ve Joe. Bob'un Joe'dan daha yaşlı veya tam tersi olduğu söylenemez, aynı kişinin isimleridir.

Eğer 'orjinal' bir dosya kavramını ve bunun yerine sembolik bir bağlantı arayan yeni bir dosya kavramını korumak istiyorsanız, bunlar daha çok bir takma addır, sadece OS'ye tek bir yoldan işlemesi gerektiği talimatı verir. altında dosya yapısını değiştirmeden başka biriydi. (Bunları "ln-s dosya bağlantısı" ile yapabilirsiniz.


Biliyorsunuz, Bob / Joe yaşına karşı gerçekten hassas olabilir ... Sert / yumuşak bağlantı karşılaştırması iyi bir sonuçtur - özellikle bir hard-link'in sadece bir dizin dosyasına eklenmiş bir giriş alacağını düşününce - zaten var olan inode - ancak soft-link kendi başına bir dosyadır ve bu nedenle kendi inode'una atanır. Yine de, her iki durumda da, değişiklik zamanı sadece bağlantılı dosya için geçerlidir, çünkü herhangi bir önem taşıyan bağlantıya yapılabilecek değişiklikler sadece yaratma / silme olacaktır.
mikeserv

2

Yukarıdaki birkaç kişi tarafından verilen cevabın temeli, her dosya adının bir dosyaya katı bir bağlantı olduğudur. Gerçek bir orijinal yok, sadece bir ilki olabilir.

Bir dizini dosya adlarını ve inode numaralarını listeleyen bir tablo olarak düşünün.

İlki de dahil olmak üzere her sabit bağlantı, inode numarasına "dosya adı" atanan bir dizindeki bir giriştir, böylece dosyaya bu ada göre erişebilirsiniz.

Dosya, inode'da depolanan meta veriler tarafından yönetilen ve izlenen diskteki bloklar topluluğudur. Bir dosyanın bir inode numarası var.

Bir dosyanın verilerine dosya adı üzerinden erişmek üç aşamalı bir işlemdir: İnode numarasını elde etmek için dosya adı dizinde aranır. İnode, verileri içeren ilgili disk bloğunu (veya blokları) bulmak için yönlendirilir. Sonra nihayet bu bloklar okunur / yazılır.

Bu nedenle, temelde bu olanlardan eve dönüş: İlk önce ("orijinal") veya daha sonra oluşturulan sabit bağlantıları kullanarak dosya içeriğine erişmek arasında hiçbir fark yoktur.

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.