İ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
İ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:
Ç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/file
bir dosyanın inode numarasını listeler. df -P /path/to/file
Dosyanın hangi dosya sisteminde olduğunu gösterir (eğer iki dosya aynı dizindeyse, aynı dosya sistemindedirler). Sisteminizde stat
komut varsa , inode ve dosya sistemi numaralarını stat
gö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ı.
fileA -ef fileB
da döner 0
eğer (başarılı) fileA
bir karşı sembolik olduğu fileB
tersi, veya bunun tersinin veya aynı dosyaya ikisi de bağlantı.
[ .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
...
[
ve bunun bir eş anlamlısıdır test
. Ancak , dış komutun man sayfasını verir man [
ya man test
da 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.
function is-hardlinked() {
r=yes
[ "`stat -c '%i' $1`" != "`stat -c '%i' $2`" ] && r=no
echo $r
}
stat -c %d
). Linux kullanıyorsanız ( stat
emrinizde) 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 .
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?
$1
ve $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.
İlk posterin önerdiği gibi, Linux'ta buna benzer bir şeye dayalı bir senaryo yazabilirsiniz:
stat -c '%i' fileA fileB fileC
stat -c %d
). Linux kullanıyorsanız ( stat
emrinizde) kabuğunuzun [ fileA -ef fileB ]
tüm bunları doğrudan yapması gerekir.
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 fileA
aynı dosya olduğu gibi fileB
o zaman find
"evet" yazdırmak ve koşul doğru olur edecektir.
Dosya eşitliği işlecini kullanmanın aksine -ef
bu, yeni bir işlem ortaya çıkarır.