Mesela bir dosyam var myold_file
. Sonra aşağıdaki ln
gibi 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ı?
Mesela bir dosyam var myold_file
. Sonra aşağıdaki ln
gibi 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ı?
Yanıtlar:
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.
.bashrc
görece bir dosya olduğunu" söylediğimizde, " göreceli yol .bashrc
iç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 :-)
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
bağlantılar farklı dizinlerde
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 mtime
dizinleri kolayca karşılaştırabilirsiniz .
Özel durum: Dizinlerden birinin mtime
dosyanın (inode) dizisinden önce bir dosyası mtime
varsa 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.
ls -lU
pü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.
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
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.
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.
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.
ls > a; ln a b; rm a; ln b c
, hangisi diğerinden daha "orijinal"?a
gitti, sen kaldıb
vec
...