두 개의 디렉토리 또는 파일이 동일한 파일 시스템에 속하는지 확인하는 방법

두 개의 디렉토리 또는 파일이 동일한 파일 시스템에 속하는지 확인하는 방법

두 디렉터리가 동일한 파일 시스템에 속하는지 확인하는 가장 좋은 방법은 무엇입니까?

허용되는 답변: bash, python, C/C++.

답변1

이는 다음을 통해 수행할 수 있습니다.장치 번호 비교.

Linux의 쉘 스크립트에서는 다음 명령을 사용하여 이 작업을 수행할 수 있습니다.통계자료:

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

존재하다파이썬:

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 셸 방법입니다(이 예는 Bash용입니다).

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

(coreutils 8.21 이상이 필요함)

관련 정보