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


15

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

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


如果您想要python / C ++答案,那么您进入的是错误的网站
Michael Mrozek

好点-我应该写“ python,C / C ++可以接受”。
Grzegorz Wierzowiecki,2012年

@MichaelMrozek记得C API的问题是关于话题:meta.unix.stackexchange.com/questions/314/...
格热戈日Wierzowiecki

Answers:



3

标准命令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;
}

非常具体的库,繁重且不标准。
桑德堡

1

“ 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或更高版本)


这需要Coreutils 8.21或更高版本。(添加了功能的提交)(报告功能的发行说明
Keith Russell
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.