İki dosya birbirine bağlı mı?


27

İki dosyanın komut satırından birbirine bağlı olup olmadığını nasıl anlarım? örneğin, bir şey bu bağlantı:

$ ls
fileA fileB fileC

$ is-hardlinked fileA fileB
yes

$ is-hardlinked fileA fileC
no

Yanıtlar:


37

Çoğu dosya sisteminde¹, bir dosya inode numarasına göre benzersiz bir şekilde belirlenir , bu nedenle tek yapmanız gereken iki dosyanın aynı inode numarasına sahip olup olmadığına ve aynı dosya sisteminde olup olmadığına bakmaktır.

Ash, ksh, bash ve zsh sizi kontrol eden bir yapıya sahiptir: dosya eşitliği operatörü -ef.

[ fileA -ef fileB ] && ! [ fileA -ef fileC ]

Daha gelişmiş durumlar için, ls -i /path/to/filebir dosyanın inode numarasını listeler. df -P /path/to/fileDosyanın hangi dosya sisteminde olduğunu gösterir (eğer iki dosya aynı dizindeyse, aynı dosya sistemindedirler). Sisteminizde statkomut varsa , inode ve dosya sistemi numaralarını statgösterebilir ( sistemden sisteme değişir, belgelerinizi kontrol edin). Bir dizindeki sabit bağlantılara hızlı bir şekilde göz atmak istiyorsanız, deneyin ls -i | sort(muhtemelen awk'a yönlendirilmiş ).

¹ cramfs gibi tüm yerli unix dosya sistemlerini ve NTFS gibi diğer birkaç karşın muhtemelen egzotik değil vakaları.


Ve kesinlikle “çapraz bağlantılı” bir dosya olarak algılanacağı FAT tabanlı hiçbir şey için değil.
Ignacio Vazquez-Abrams,

4
Not o fileA -ef fileBda döner 0eğer (başarılı) fileAbir karşı sembolik olduğu fileBtersi, veya bunun tersinin veya aynı dosyaya ikisi de bağlantı.
janmoesen

önerdiğin komutu gerçekten nasıl çalıştırıyorsun? [.Bashrc -ef .bash / .bashrc] ve bunun çeşitlerini denedim ama gerçekten işe yaramadı.
Charlie Parker,

@ CharlieParker [ .bashrc -ef .bash/.bashrc ]doğru. Bağlam olmadan, elbette, neden “gerçekten işe yaramadı” hakkında hiçbir fikrim yok - yanlış dosyaları karşılaştırabilir, sonucu doğru şekilde kontrol edemeyebilirsiniz, bir kabuk kullanmadan olabilir -ef...
Gilles 'SO- kötülük yapmayı bırak'

2
@ CharlieParker Bu komut aslında [ve bunun bir eş anlamlısıdır test. Ancak , dış komutun man sayfasını verir man [ya man testda verir, oysa hemen hemen her kabuk biraz farklı seçeneklere sahip yerleşik bir komut içerir, bu yüzden bunu kabuğunuzun kılavuzuna bakmanız gerekir.
Gilles 'SO- kötülük olmayı bırak'

4
function is-hardlinked() {
    r=yes
    [ "`stat -c '%i' $1`" != "`stat -c '%i' $2`" ] && r=no
    echo $r
}

6
İki dosya farklı dosya sistemlerinde ise ancak aynı inode varsa, bunun yanlış bir pozitif olabileceğini unutmayın. Cihaz numarasını da test etmeniz gerekiyor ( stat -c %d). Linux kullanıyorsanız ( statemrinizde) kabuğunuzun [ fileA -ef fileB ]tüm bunları doğrudan yapması gerekir. Ayrıca, komutunuz boş alan içeren dosya adlarını boş bir şekilde keser ya \[?*da şu şekilde başlar -: komut susbtitutions ( "$(stat -c %i -- "$1")") öğesine her zaman çift tırnak işareti koyar .
Gilles 'SO- kötülük'

1
Neden bir dizi hantal ama taşınabilir yapıyı ve sonra function(tire işareti içeren) izin verilen adlara ilişkin POSIX sözleşmelerini ihlal eden bir işlev adı olan, taşınabilir olmayan anahtar kelimeyi kullanırsınız?
Charles Duffy

Sen senin alıntı unuttum $1ve $2. Ayrıca $(), parantez yerine sözdizimini kullanmak isteyebilirsiniz, çünkü parantezler komutun nerede başladığını ve nerede bittiğini ve yuvalamanın daha kolay olduğunu açıkça belirtir.
josch

3

İlk posterin önerdiği gibi, Linux'ta buna benzer bir şeye dayalı bir senaryo yazabilirsiniz:

stat -c '%i' fileA fileB fileC

4
Bu yeterli değil: eğer farklı dosya sistemlerinde iseniz ancak aynı inode'a sahipseniz, iki dosya için aynı numarayı alırsınız. Cihaz numarasını da test etmeniz gerekiyor ( stat -c %d). Linux kullanıyorsanız ( statemrinizde) kabuğunuzun [ fileA -ef fileB ]tüm bunları doğrudan yapması gerekir.
Gilles 'SO- kötülük'

0

GNU find(1)sürüm 4.2.11 veya daha yeni sürümlerle bunu da kullanabilirsiniz:

if [ "yes" = "$(find fileA -samefile fileB -exec echo yes \;)" ]; then
    echo yes
else
    echo no
fi

Eğer fileAaynı dosya olduğu gibi fileBo zaman find"evet" yazdırmak ve koşul doğru olur edecektir.

Dosya eşitliği işlecini kullanmanın aksine -efbu, yeni bir işlem ortaya çıkarır.

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.