如何检查两个目录或文件是否属于同一文件系统

如何检查两个目录或文件是否属于同一文件系统

检查两个目录是否属于同一文件系统的最佳方法是什么?

可接受的答案:bash、python、C/C++。

答案1

可以通过以下方式完成比较设备编号

在 Linux 上的 shell 脚本中,可以使用以下命令完成统计数据:

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

Python:

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

或者

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

答案2

标准命令df显示指定文件所在的文件系统。

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

我刚刚在基于 Qt / C++ 的项目中遇到了同样的问题,并找到了这个简单且可移植的解决方案:

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

答案4

“stat”答案很简洁,但当两个文件系统位于同一设备上时,它会出现误报。这是迄今为止我发现的最好的 Linux shell 方法(此示例适用于 Bash)。

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

(需要 coreutils 8.21 或更高版本)

相关内容