Linux의 동일한 파티션에서 2개의 디렉터리가 호스팅되는지 확인하세요.

Linux의 동일한 파티션에서 2개의 디렉터리가 호스팅되는지 확인하세요.

/my/dir와 동일한 파티션에 있는지 확인하는 방법은 무엇입니까 /?

이는 스크립트에 통합하기 위한 것입니다. 바인드 마운트는 올바르게 처리되어야 합니다. POSIX 호환 솔루션을 환영합니다.

답변1

stat를 사용하여 다음을 확인할 수 있습니다.

$ stat -c '%d %m' /proc/sys/
3 /proc

장치 번호와 디렉토리가 설치된 위치를 표시합니다.

답변2

다음 명령은 파일이 포함된 마운트 지점에 고유한 이름을 지정합니다 $file.

df -P -- "$file" | awk 'NR==2 {print $1}'

이는 모든 경우에 적용됩니다.POSIX체계. 이 -P옵션은 예측 가능한 형식을 적용합니다. 두 번째 줄의 첫 번째 필드는 "파일 시스템 이름"입니다. 따라서 두 파일이 모두 동일한 마운트 지점에 있는지 확인하려면 다음을 수행하십시오.

if [ "$(df -P -- "$file1" | awk 'NR==2 {print $1}')" = \
     "$(df -P -- "$file2" | awk 'NR==2 {print $1}')" ]; then
  echo "$file1 and $file2 are on the same filesystem" ; fi

또는 여러 프로세스 호출을 저장합니다.

if df -P -- "$file1" "$file2" |
   awk 'NR!=1 {dev[NR] = $1} END {exit(dev[2] != dev[3])}'; then
  echo "$file1 and $file2 are on the same filesystem" ; fi

일부 운영 체제에서는 볼륨 이름에 공백이 있을 수 있습니다. 이 경우 출력을 구문 분석하는 완전히 신뢰할 수 있는 방법은 없습니다 df.

뒤에서는 st_dev반환된 필드를 통해 파일이 포함된 파일 시스템을 식별 할 수 있습니다.stat. 쉘 스크립트를 통해 이를 수행할 수 있는 이식 가능한 방법은 없습니다. 일부 시스템에는 stat유틸리티가 있지만 해당 구문은 다릅니다.

  • 내장되지 않은 Linux, Cygwin 또는 GNU coreutils가 있는 기타 시스템에서는 stat호출 시 이 필드가 보고됩니다.st_devstat -c %D -- "$file"
  • 일부 BusyBox 설치에는 다음이 포함됩니다.statGNU coreutils와 호환됩니다. 다른 사람들은 선택의 여지가 stat없습니다 %c. 이를 사용할 수 있지만 stat -t -- "$file" | awk '{print $8}'파일 이름에 공백이 포함되지 않거나 임의의 파일 이름을 처리하지만 나중에 출력에 필드를 추가하는 stat -t -- "$file" | awk 'END {print $(NF-8)}'데는 작동하지 않는 경우에만 작동합니다.stat
  • BSD 시스템은 서로 다릅니다stat유용이것은 필요합니다 stat -f %d -- "$file".
  • Solaris, AIX 및 기타 운영 체제 stat용 유틸리티 는 없습니다.

Perl을 사용할 수 있는 경우 다음을 사용할 수 있습니다.

perl -e 'print ((stat($ARGV[0]))[0])' -- "$file"

그리고 비교해보세요:

perl -e 'exit((stat($ARGV[0]))[0] != (stat($ARGV[1]))[0])' -- "$file1" "$file2"

일부 특수한 경우에는 원하는 결과가 명확하지 않습니다. 예를 들어 Linux 바인드 마운트의 경우 및 이후 mount --bind /foo /bar는 동일한 파일 시스템으로 간주됩니다. 두 파일이 실제로 동일한 장치에 있을 수 있지만 알 수는 없습니다. 예를 들어 파일이 두 개의 서로 다른 네트워크 마운트에 있는 경우 클라이언트는 서버가 서로 다른 파일 시스템을 내보내고 있는지 알 수 없습니다./foo/bar

파일이 디렉터리이고 여기에 쓸 수 있는 경우 또 다른 방법은 임시 파일을 만들고 하드 링크를 만드는 것입니다. 이 보고서는 Linux 바인드 마운트에 대한 부정적인 결과를 보고합니다.

tmp1=$(TMPDIR=$dir1 mktemp)
tmp2=$(TMPDIR=$dir2 mktemp)
if ln -f -- "$tmp1" "$tmp2"; then
  echo "$dir1 and $dir2 are on the same filesystem, which supports hard links"
fi
rm -f "$tmp1" "$tmp2"

답변3

test $(df -P $path1 $path2 | awk '{if (NR!=1) {print $6}}' | uniq | wc -l) -eq 1

여러 경로에서 작동합니다.

답변4

POSIX에서 사용할 수 있는 가장 확실한 솔루션은 파일을 비교하는 것입니다.장치 아이디제공:stat(2) 함수.

Perl에도 비슷한 기능이 있습니다.통계 함수~처럼자일스 지적:

perl -e 'exit((stat($ARGV[0]))[0] != (stat($ARGV[1]))[0])' -- file1 file2

그러나 "POSIX 방식"은 C 프로그램을 사용하는 것입니다. 예를 들면 다음과 같습니다.

./checksamedev file1 file2

그 소스코드는 다음과 같습니다.

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int main(int argc, char* argv[]) {
    struct stat s1, s2;
    if( argc==3 && lstat(argv[1], &s1)==0 && lstat(argv[2], &s2)==0 )
        return !(s1.st_dev == s2.st_dev);
    return 2;
}

두 파일의 장치 ID가 동일하면 동일한 파일 시스템에서 호스팅되며, 이 경우 위 명령은 0을 반환합니다(그렇지 않으면 다른 값을 반환함). 으로 확인하세요 echo $?.

이는 번들 설치에는 작동하지만 네트워크 설치에는 작동하지 않을 수 있습니다.

관련 정보