Jaki jest najlepszy sposób sprawdzenia, czy dwa katalogi należą do tego samego systemu plików?
Dopuszczalne odpowiedzi: bash, python, C / C ++.
Jaki jest najlepszy sposób sprawdzenia, czy dwa katalogi należą do tego samego systemu plików?
Dopuszczalne odpowiedzi: bash, python, C / C ++.
Odpowiedzi:
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
Standardowe polecenie df
pokazuje, 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
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;
}
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)