Jak sprawdzić, czy dwa katalogi lub pliki należą do tego samego systemu plików

15

Jaki jest najlepszy sposób sprawdzenia, czy dwa katalogi należą do tego samego systemu plików?

Dopuszczalne odpowiedzi: bash, python, C / C ++.

Grzegorz Wierzowiecki
źródło
Jeśli chcesz odpowiedzi na pytania w języku Python / C ++, jesteś na niewłaściwej stronie
Michael Mrozek
Dobra uwaga - powinienem napisać: „Python, C / C ++ są dopuszczalne”.
Grzegorz Wierzowiecki
@MichaelMrozek pamiętaj, że pytania C API są na ten temat: meta.unix.stackexchange.com/questions/314/…
Grzegorz

Odpowiedzi:

23

Można tego dokonać porównując numery urządzeń .

W skrypcie powłoki w systemie Linux można to zrobić za pomocą stat :

stat -c "%d" /path  # returns the decimal device number 

W python :

os.lstat('/path...').st_dev

lub

os.stat('/path...').st_dev
Grzegorz Wierzowiecki
źródło
3

Standardowe polecenie dfpokazuje, w jakim systemie plików znajdują się określone pliki.

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
Gilles „SO- przestań być zły”
źródło
3

Właśnie natrafiłem na to samo pytanie w projekcie opartym na Qt / C ++ i znalazłem to proste i przenośne rozwiązanie:

#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;
}
Ciastko
źródło
Bardzo specyficzna biblioteka, ciężka i niestandardowa.
Sandburg
1

Odpowiedź „stat” jest krótka, ale otrzymuje fałszywie dodatnie wyniki, gdy dwa systemy plików znajdują się na tym samym urządzeniu. Oto najlepsza metoda powłoki Linux, jaką znalazłem do tej pory (ten przykład dotyczy Bash).

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

(wymaga Coreutils 8.21 lub nowszego)

Keith Russell
źródło
Wymaga to Coreutils 8.21 lub nowszej. ( zatwierdzenie, które dodało funkcję) ( informacje o wydaniu, które zgłaszają tę funkcję)
Keith Russell