İki dizin veya dosyanın aynı dosya sistemine ait olup olmadığı nasıl kontrol edilir


15

İki dizinin aynı dosya sistemine ait olup olmadığını kontrol etmenin en iyi yolu nedir?

Kabul edilebilir cevaplar: bash, python, C / C ++.


Python / C ++ cevapları istiyorsanız yanlış sitede bulunuyorsunuz
Michael Mrozek

İyi bir nokta - "python, C / C ++ kabul edilebilir" yazmalıyım.
Grzegorz Wierzowiecki

@MichaelMrozek C API sorularının konuyla ilgili olduğunu unutmayın: meta.unix.stackexchange.com/questions/314/…
Grzegorz Wierzowiecki

Yanıtlar:



3

Standart komut df, belirtilen dosyaların hangi dosya sisteminde bulunduğunu gösterir.

if df -P -- "$1" "$2" | awk 'NR==2 {dev1=$1} NR==3 {exit($1!=dev1)}'; then
  echo "$1 and $2 are on the same filesystem"
else
  echo "$1 and $2 are on different filesystems"
fi

3

Aynı soruya Qt / C ++ tabanlı bir projede rastladım ve bu basit ve taşınabilir çözümü buldum:

#include <QFileInfo>
...
#include <sys/stat.h>
#include <sys/types.h>
...
bool SomeClass::isSameFileSystem(QString path1, QString path2)
{
        // - path1 and path2 are expected to be fully-qualified / absolute file
        //   names
        // - the files may or may not exist, however, the folders they belong
        //   to MUST exist for this to work (otherwise stat() returns ENOENT) 
        struct stat stat1, stat2;
        QFileInfo fi1(path1), fi2(path2),
        stat(fi1.absoluteDir().absolutePath().toUtf8().constData(), &stat1);
        stat(fi2.absoluteDir().absolutePath().toUtf8().constData(), &stat2);
        return stat1.st_dev == stat2.st_dev;
}

Çok özel kütüphane, ağır ve standart değil.
Sandburg

1

"Stat" yanıtı en tersidir, ancak aynı dosyada iki dosya sistemi olduğunda yanlış pozitifler alır. İşte şimdiye kadar bulduğum en iyi Linux kabuk yöntemi (bu örnek Bash için).

if [ "$(df file1 --output=target | tail -n 1)" == \
     "$(df file2 --output=target | tail -n 1)" ]
    then echo "same"
fi

(8.21 veya daha yeni coreutils gerektirir)


Bu, Coreutils 8.21 veya daha yenisini gerektirir. ( özelliği ekleyen taahhüt ) (özelliği bildiren sürüm notları )
Keith Russell
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.