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 ++.


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:



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

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;
}

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)


Wymaga to Coreutils 8.21 lub nowszej. ( zatwierdzenie, które dodało funkcję) ( informacje o wydaniu, które zgłaszają tę funkcję)
Keith Russell
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.