Sabit bağlantılar normal dosyalar olarak sayılıyor mu?


21

Bunu kaydetmenin bir yolu olup olmadığını merak ediyordum, ancak modern arama motorlarının çoğu yaklaşık 5 kelime uzunluğunda ifadelerle iyi çalışmadığından, bu konuda biraz yardıma ihtiyacım var.

Bunu merak ediyordum çünkü dosyaları belli tiplerde kaydetmesi ve buna göre karar vermesi gereken bir bash betiği yapıyorum. Bu teknik olarak projem için önemli değil, ama merak ettim.

Ayrıca, normal dosyalar olarak kabul edilirlerse, o zaman bu dosyaların ayrıştırılmak zorunda kalmadan birbiriyle bağlantılı olup olmadığını kontrol etmenin bir yolu var ls -imı? Ve herhangi bir keyfi dosyanın (X), herhangi bir keyfi dosya (Y) ile find -ikomuta girmeden bağlanıp bağlanmadığını kontrol etmenin bir yolu var mı?


5
Sabit linklerle "X" gerçekten "Y" ile bağlantılı değildir. "X" ve "Y" aynı dosyadır.
Ürdün

6
Bir dizindeki tüm "normal dosyalar" sabit linklerdir. Bu tür bazı dosyaların birden fazla var.
Andrew Henle,

@AndrewHenle Wow, iyi nokta. Bu tam olarak aradığım şeydi, çok teşekkürler.
Bay Minty Fresh,

2
@ Mr.MintyFresh Özellikle, "orjinal" ile "link" arasında sembolik linklerde olduğu gibi bir ayrım yoktur.
Random832

Yanıtlar:


38

Unix tarzı sistemlerde, dosya sistemi nesnelerini temsil eden veri yapısı (diğer bir deyişle, bir dosya hakkındaki veriler ), "inode" adı verilen şeyde depolanır.

Bir dosya adı sadece bu inode için bir linktir ve “hard link” olarak adlandırılır. Bir dosyanın verildiği ad ile bir sonraki bağlantı arasında hiçbir fark yoktur. Yani cevap, "evet" dir: bir hard link normal bir dosyadır ve gerçekten de normal bir hard linktir.

lsKomut dosyasına kaç sabit bağlantılar gösterecektir.

Örneğin:

seumasmac@comp:~$ echo Hello > /tmp/hello.txt
seumasmac@comp:~$ ls -l /tmp/hello.txt 
-rw-rw-r-- 1 seumasmac seumasmac 6 Oct  4 13:05 /tmp/hello.txt

Burada adlı bir dosya oluşturduk /tmp/hello.txt. 1Çıktıda ls -lbu dosyaya 1 sabit bağlantı olduğunu gösterir. Bu hard link dosya isminin kendisidir /tmp/hello.txt.

Şimdi bu dosyaya başka bir sabit link oluşturursak:

seumasmac@comp:~$ ln /tmp/hello.txt /tmp/helloagain.txt
seumasmac@comp:~$ ls -l /tmp/hello*
-rw-rw-r-- 2 seumasmac seumasmac 6 Oct  4 13:05 /tmp/helloagain.txt
-rw-rw-r-- 2 seumasmac seumasmac 6 Oct  4 13:05 /tmp/hello.txt

Artık her iki dosya adının da dosyaya 2 sabit bağlantı olduğunu gösterdiğini görebilirsiniz. Bunların hiçbiri "uygun" dosya adı değil, ikisi de eşit derecede geçerli. İkisinin de aynı düğüme işaret ettiğini görebiliyoruz (bu durumda, 5374043):

seumasmac@comp:~$ ls -i /tmp/hello*
5374043 /tmp/helloagain.txt  5374043 /tmp/hello.txt

Bunun dizinler için farklı olduğu konusunda yaygın bir yanılgı bulunmaktadır. İnsanların lsbir dizin için döndürülen bağlantı sayısının alt dizinlerin sayısı olduğunu .ve ..hangilerinin yanlış olduğunu söylediğini duydum . Veya, en azından, size doğru rakamı verirken, yanlış sebeplerden dolayı doğru!

Eğer bir dizin yaratır ve yaparsak ls -ld:

seumasmac@comp:~$ mkdir /tmp/testdir
seumasmac@comp:~$ ls -ld /tmp/testdir
drwxrwxr-x 2 seumasmac seumasmac 4096 Oct  4 13:20 /tmp/testdir

Bu, bu dizine 2 sabit bağlantı olduğunu gösterir. Bunlar:

/tmp/testdir
/tmp/testdir/.

Not /tmp/testdir/..olduğu değil bu dizine bir bağlantı, bu bir bağlantı var /tmp. Bu da size "alt dizinlerin sayısı" olayının neden çalıştığını söyler. Yeni bir alt dizin yarattığımızda:

seumasmac@comp:~$ mkdir /tmp/testdir/dir2
seumasmac@comp:~$ ls -ld /tmp/testdir
drwxrwxr-x 3 seumasmac seumasmac 4096 Oct  4 13:24 /tmp/testdir

Şimdi /tmp/testdirdizine 3 sabit bağlantı olduğunu görebilirsiniz . Bunlar:

/tmp/testdir
/tmp/testdir/.
/tmp/testdir/dir2/..

Bu nedenle, her yeni alt dizin, ..içerdiği girişten dolayı bağlantı sayısını bir artırır .


Meta verilerin, düğümlerin ve sert bağlantıların nasıl çalıştığını anlıyorum. Sabit bağlı dosyanın normal bir dosya olarak sayılıp sayılmadığını netleştirmek gerekiyordu. Bu sadece bana bunun adanmış sütun nedeniyle cevabın 'evet' olduğunu gösteriyor, bu da bunun tüm dosyalara özgü olduğunu gösteriyor. Çok üzgünüm, ama bunu reddetmek zorunda kalacağım :(
Bay Minty Fresh

Sorun değil, eminim başkası için bilgi olacaktır.
seumasmac

Dotglob hardlink sistemi ile ilginç bir düzenleme, bunu yaptığını hiç bilmiyordum.
Bay Minty Fresh

Sabit bağlantılar == normal dosyalar paragrafı açıklığa kavuşturuldu.
seumasmac

1
Özellikle cümle gibi: "Bunların hiçbiri" uygun "bir dosya adı değil, ikisi de aynı şekilde geçerli." Bu, sert bağlantıların anlaşılması için çok önemli bir bileşendir. Çok güzel yazılmış.
Wildcard

4

Sabit bağlantılar normal dosyalar olarak sayılıyor mu?

Sabit bağlantılar, bağlı oldukları her şey olarak sayılır. Aynı dosya sistemindeki herhangi bir şeye bağlanabilirsiniz.

mkdir test
cd !$

>file
ln -s file sym
mknod pipe p

ln file file2
ln -P sym sym2
ln pipe pipe2

ls -al

# sockets, too:
cat >tsock.c <<\EOD
#include <sys/socket.h>
#include <sys/un.h>
int main(int n, char **a)
{
        struct sockaddr_un test = { AF_UNIX, "socket" };
        int testfd = socket(AF_UNIX, SOCK_SEQPACKET, 0);
        bind(testfd,(struct sockaddr *)&test,sizeof test);
}
EOD
make tsock
./tsock

ln socket socket2

ls -al

# even devices if you want:
sudo mknod mytty c 5 0
ln mytty mytty2
sudo chmod 666 mytty

ls -al
# notice permissions are on an object not on the links to it:
echo Hi, Kilroy! >mytty2  

Her şeye bir hardlink eşittir, altta yatan nesne etrafında herhangi bir (düzenleme: sembolik olmayan) bağlantı olduğu sürece (yani utanç verici olduğum açık bir dosya tanımlayıcısı bile çok minnettar olur) bağlantı yapışır.

Sistem, dizin linklerine kuralları uygular, bir dizine bir link verilir ve sistem kendi gömülü .linkini ve herhangi bir alt dizin linkini otomatik olarak ekler ..( .yukarıdakilerin iki linke sahip olduğuna dikkat edin ), ancak bu, kipli bir modda açık bir kontrol sistemleri ayrıcalıklı kullanıcılar söz veriyorum döngü yapmamak için söz verip yeni bağlantılar ekleyebilirler. Dosya sistemi umursamıyor, isteğe bağlı dizin grafiklerini gayet iyi şekilde temsil ediyor olabilir ama kimse onlarla ilgilenmek istemiyor.

Bu şekilde çalışmayan (unix olmayan) bir çok dosya sistemi var, bunlardan bazıları "sabit bağlantılar" yerine ne teklif ettiklerini söylüyor. OS X, doğru anımsarsam, buradaki anlambilgiyi ne kadar sadık bir şekilde koruduğumu bilmiyorum, HFS + 'ya (doğal olarak sahip olmayan) eşdeğeri elde etti.


./tsockZaten aslında ne yapar ?
mikeserv

@mikeserv Yukarıdaki bir yuva oluştur programı, geçerli dizinine "socket" adlı bir soket bağlantısını bırakıyor.
jthill

Tamam, ama belki de soketler hakkında ne kadar az şey bildiğimi netleştirmeliydim. Bağlantıları yeterince iyi anladığımı ve aynı sokete yeni bir isim verdiğini düşünüyorum. bunun prizler veya herhangi bir şey için özel bir önemi yoktur, tamam mı? cehaletim için üzgünüm
mikeserv

1
@mikeserv Bir soket tamamen çalışma zamanıdır. socket()gerçek bir soket oluşturur, bind()belirli bir ad verir, connect()yaptığınız bir soketi bazı adlandırılmış soketlere bağlar. Priz çeşitleri isimleri farklı kullanabilirsiniz, örneğin İnternet prizler İnternet adresleri kullanmak, ama hepsi pay ortak API (dahil read()ve write(), bu olamaz beni üzüyor open()bir dosya sistemi soket ve OS varsa veya yapmak libc socket()ve connect()sizin için) . man 7 socketdahası, tüm ağ protokolleri bir gizlilik manpage için yapmak yok.
jthill

1
@mikeserv Bakın, pty ve pts ve muhtemelen ptmx'i iyi bir günde heceleyebiliyorum, ama bu konuda. :-) en azından 5,0 düğüm bulabildiğim her yerde çalışıyor, kontrol cihazı türü. Sadece ls -l / dev / tty ile aldım, sanırım orada şanslıydım.
jthill
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.