Dosya izni ile sahip-l komut çıktısındaki dosya sahibi arasındaki sayı nedir?


35

ls -lKomutun çıktısı aşağıdaki sonucu verir:

görüntü tanımını buraya girin

Dosya izni ile sahibi arasındaki sayı alanı nedir? yani bu 1, 1, 1 ve 2 nedir? Kontrol ettim --helpama bu açıklamıyor.

[EDIT] Bir dizindeki dosya sayısının olduğunu sanıyordum ama değil. Resme bakınız. "tempFolder" 3 dosyaya sahip ancak yine de "2" gösteriyor

Yanıtlar:


33

Not: @StephaneChazelas yorumundan sonra düzenlendi

ls -lİzin bloğundan sonraki çıktının ilk sayısı , sabit bağlantıların sayısıdır .

Bu, stat"Bağlantılar" komutunda döndürülen değerle aynı değerdedir .

Bu sayı, bir dosyaya atıfta bulunurken, dosyanın bir dizine atıfta bulunurken içerdiği dizin girişlerinin sayısıdır.

Bir dosya genellikle 1 sabit bağlantı sayısına sahiptir, ancak bu lnkomutla zor bağlantılar yapılırsa değişir . Debian Reference kılavuzuna bakın .

Örnekte, tempFile2 için sabit bir link eklemek link sayısını arttırır:

ln -l
ln tempFile2 tempHardLink
ln -l

Hem tempFile2 ve tempHardLink 2 'lik bir bağlantı sayımına sahip olacaklardır.

Aynı şeyi sembolik bir link ( ln -s tempFile2 tempSymLink) ile yaparsanız, sayım değeri artmaz.

Bir dizinde'.' (kendisine bağlantı) ve üst dizinde yer alan girdiler için en az 2 adet sayılır .

Örnekte, tempFolder'ın bağlantı sayısını artırmak istiyorsanız , yeni bir dizin oluşturun; bu sayı artacaktır.

ls -l tempFolder
mkdir tempFolder/anotherFolder
ls -l tempFolder

Başka birFolder / ile tempFolder / (olan ..) arasındaki bağlantı sayıma eklenecektir.



Mülkler ile mülkiyet arasında görüntülendiğinden, çok önemli olduğu izlenimini edersiniz, ama ben hiç kullanmadım. Genellikle ne zaman gereklidir?
Emanuel Berg,

1
Bu yanlış. Bu bağlantı sayısı, periyodu. Dizinler için, ana dizindeki girişi (tıpkı herhangi bir dosya gibi) ve .kendi içindeki girişi için 2, artı her bir alt dizinindeki ..girişler için bir tane var .
Stéphane Chazelas

@StephaneChazelas Bulduğum tüm belgeler hard link sayımı hakkında konuştu (örneğin, linuxgazette.net/issue35/tag/links.html ). Ayrıca benzer bir sorunun AskUbuntu'da da sorulduğunu öğrendim ( askubuntu.com/questions/19510/… ). Coreutils kaynak kodunu kontrol edeceğim ve tam cevabı bulabilecek miyim bakacağım.
Damien

2
@EmanuelBerg dosya sistemleri iken çok daha az artık ve size geliştirilen dosya sistemi üzerinde çalıştığını ve daha güvenilir ls2 karakter geçirmek ve size daha fazla bilgi verebilir ve hiçbir orada stat(1)komuta ne de find(1)ne de fsckmuhtemelen çok fazla oldu, ne de sembolik bağlar bugün olduğundan daha faydalı. Yazarları çoktan geçmiş olan kabuk senaryolarını kırmadan değiştirilemez /dev/null; En az 1979'dan beri böyle oldu.
11'de

8

Unix'te, tipik olarak, bir dosya bir dosya tablosundaki bir giriştir. Farklı dosya türleri vardır: normal dosyalar, cihazlar, sembolik bağlantılar, kapılar, borular, soketler, dizinler ...

İnode numarası (çıktısında görebileceğiniz ls -i) bu tablodaki indekstir.

Şimdi, dosyalara inode değil yol yoluyla erişiyorsunuz . Bir yol zinciridir dizin girdileri. Burada klasörden değil, dizinden bahsettiğimizi fark edeceksiniz . Çünkü bu bir rehberdir (bir telefon rehberini düşünün).

Bir dizin, bir dizi düğüme isim veren özel bir dosya türüdür. Bir dizin girişi bir isimden bir inode'a eşlemedir.

Belirli bir dosya (inode) bir dizinde birden fazla isme sahip olabilir (bir telefon numarasında birden fazla isim olması gibi) ve ayrıca birden fazla dizinde de isimler (girişler) olabilir. Bu denir bağlantılar olarak da bilinen sabit bağlantılar ile ayırt elektronik bağlantılar (bir yol için bir işaretçi dosyası özel bir türü).

Bir dosya (inode), sahip olduğu bağlantıların (herhangi bir dizindeki girişlerin) sayısını takip eder, böylece sayı 0'a ulaştığında (başvurduğu son dizinden bağlantısı kesildiğinde), serbest bırakılır.

ls -lÇıktıda görüntülenen sayı (bağlantı sayısı) .

Dizin olmayan bir dosya ilk kez oluşturulduğunda ( openveya creat(veya bindveya mknodbazı dosya türleri için) sistem çağrılarıyla), yeni dosyaya (benzeri "/a/b") bir yol sağlayarak yapılır . Daha sonra olan ise yeni bir dosya ve inode tahsis edilmiş ve kök dizindeki "a"adla ilişkilendirilmiş dizine yeni bir giriş eklenmiştir "/". Bu ilk linktir, yani link sayısı birdir.

Daha sonra link()sistem çağrısı ( lnkomut) ile daha fazla bağlantı eklenebilir . Ve bağlantılar unlink()sistem çağrısı ( rmkomut) ile kaldırılabilir .

Type dizin dosyalarının genellikle 2'ye eşit veya daha büyük olan birkaç bağlantıya sahip olduğunu fark edeceksiniz .

Şimdi, bir dizin oluşturduğunuzda, mkdir()sistem çağrısını çağırıyorsunuz. Gibi bir şey mkdir("/a/b"). O zaman ne yapılacağı yeni bir tür dizin dizinidir. Bu yeni dizinde otomatik olarak iki giriş oluşturur:

  • "."( dizin için nokta ). Bu da kendine bir bağlantıdır. Yani bağlantı sayısı 1'dir.
  • ".."(için dizin sitesindeki dizini ). Bu bir bağlantıdır "/a". Yani bağlantı sayısı "/a"bir artar

Ardından bu yeni dizin bağlanır "/a"(bunun için bir giriş eklenir "/a"), bu nedenle bağlantı sayısı şimdi 2 olur. Bir "/a/b/c"dizin oluşturulursa, ".."giriş nedeniyle "/a/b/c", bağlantı sayısı "/a/b"3 olur.

Çoğu Unice, bir dizine başka bağlantılar oluşturmayı kısıtlar çünkü sorunlu döngülere neden olabilirler. Bir link()dizinde bir dizine izin verdiklerinde , genellikle yalnızca süper kullanıcı bunu yapabilir.

Gibi bazı dosya sistemleri btrfsbu geleneksel dizin yapısından ayrılır. btrfsDosya sistemlerindeki dizinler üzerindeki link sayımlarının her zaman bir tane olduğunu göreceksiniz, bu dizinler "."kendilerinde aynı inode numarasına sahip bir giriş içeriyor olsa da .

Bağlantı sayısının geleneksel olarak 2 artı alt dizin sayısının kullanımı gerçektir. Örneğin, içinde:

find . -name '*.c' -print

Eğer .subdirs içerebilir, ancak dosyaları milyonlarca içeren etmez. Link sayısını kontrol ederek ., findherhangi bir alt dizin olduğunu bilemez. Bu yüzden tek findyapmanız gereken, dizinin içeriğini okumak ve biten girişleri bildirmektir .c( grep '\.c$'birkaç megabaytlık dosyada olduğu gibi). Aksi takdirde, findiçeriye girecek dizinler olup olmadığını görmek için her bir dosyanın türünü kontrol etmek zorunda kalacaksınız ( lstat()sistem çağrıları kadar sonuçlanabilir ). Tabii ki, bu tür bir optimizasyon üzerinde çalışmaz btrfs(Linux'un modern sürümlerinde, bazı dosya sistemlerinde (dahil olmak üzere btrfs) dosya türü de dosya girişinde saklanır getdents(2)ve girişlerin listesini almak için kullanılan sistem çağrısı tarafından döndürülür. bir dizindelstat hala gerekli değildir).


+1, great answer :) ls kaynak koduna baktığımda, stat numarasına yapılan çağrının ardından bağlantı numarasının güncellendiğini fark ettim. Böylece, stat komutu bir dosya veya dizinin bağlantılarının değerini verecektir.
Damien,

Çıktı -izinlerinden sonra herhangi bir sayı yerine sahip olmak ne demektir ls -l?
Shubham
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.