What's the best way to check if two directories belong to the same filesystem?
Acceptable answers: bash, python, C/C++.
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. It only takes a minute to sign up.
Sign up to join this communityWhat's the best way to check if two directories belong to the same filesystem?
Acceptable answers: bash, python, C/C++.
It can be done by comparing device numbers.
In a shell script on Linux it can be done with stat:
stat -c "%d" /path # returns the decimal device number
In python:
os.lstat('/path...').st_dev
or
os.stat('/path...').st_dev
The standard command df
shows on what filesystem the specified file(s) is located.
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
I just came across the same question in a Qt / C++ based project, and found this simple and portable solution:
#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;
}
The "stat" answer is tersest, but it gets false positives when two filesystems are on the same device. Here is the best Linux shell method I've found so far (this example is for Bash).
if [ "$(df file1 --output=target | tail -n 1)" == \
"$(df file2 --output=target | tail -n 1)" ]
then echo "same"
fi
(requires coreutils 8.21 or newer)