* nix에서 특정 파일이 어떤 파일 시스템에 있는지 확인하는 방법은 무엇입니까?


12

일반적인 현대 유닉스 환경 (예 : GNU / Linux, GNU / Solaris 또는 Mac OS X)에서 특정 절대 파일 경로가 어떤 마운트 포인트 및 파일 시스템 유형인지 확인하는 좋은 방법이 있습니까?

명령을 실행하고 해당 출력을 수동으로 구문 분석하고 파일 경로와 문자열을 비교할 있다고 가정 mount하지만 그렇게하기 전에 더 우아한 방법이 있는지 궁금합니다.

확장 속성을 사용하는 BASH 스크립트를 개발 중이며 다양한 파일 시스템 및 호스트 환경에 대해 올바른 작업을 수행하려고합니다.

답변:


19

명령 df(1)은 하나 이상의 인수를 사용하여 해당 파일 또는 디렉토리가있는 마운트 포인트 및 장치와 사용 정보를 리턴합니다. 그런 다음 경로 또는 장치를 사용하여 출력에서 mount -v또는 유사한 파일 시스템 유형을 찾을 수 있습니다.

불행하게도, 출력 모두의 형식 dfmount시스템에 의존하다; 적어도 Solaris, NetBSD 및 Mac OS X 사이에서 볼 수 있듯이 명백한 표준은 없습니다.


1
df -PPOSIX 호환 시스템에서 표준화 된 출력을 생성해야합니다. 일부 구 피어 시스템은 POSIXLY_CORRECT와 같은 마법 환경 변수도 설정해야합니다.
댄 성형

df /path-to-the-directory당신에게 그 디렉토리의 포함 된 파티션을 줄 것이다
Hasanuzzaman 사타르에게

7

stat 사용할 수 있습니다 . stat --printf '% d'filename.txt 명령 은 장치 번호를 16 진수 / 10 진수로 반환합니다.


그렇다면 장치 이름을 기반으로하는 방법은 무엇입니까?
데이지

/ dev /의 모든 장치 파일을 통해 가서 stat보고 된 것과 동일한 부 번호를 가진 파일을 찾아야합니다.
Wiesław Herr

stat --printf "%d"장치의 부 번호를 알려주지 만 장치 이름과 마운트 된 파일 시스템을 얻기 위해 수행해야 할 작업이 더 있습니다.
Craig McQueen

2
최근에 추가되었지만 stat --format '%m' $file마운트 지점 stat --file-system --format '%T' $mount을 제공하고 파일 시스템 유형 이름을 제공 할 수 있습니다.
roaima

1
@TomHale : 솔직히 기억하지 마십시오. 그러나 나는 그것이 작동하지 않았다는 것을 기억합니다. 분명히 나는 ​​배포판, 커널 버전 등을 언급해야한다. 그러나 당신은 그것이 작동한다고 말하면서, 그것이 고정 된 것을 의미 할 수도 있습니다. 순 결과가 효과가 있다면, 훌륭합니다 :)
0xC0000022L


2

흠. 마운트 포인트의 경우 st_dev가 변경 될 때까지 계층 구조를 올라갈 수 있습니다 (그런 다음 마운트 경계를 넘었습니다). stat배쉬 스크립트를위한 GNU 가있다; 그러나 파싱하지 /proc/mounts않거나 시행 착오로 파일 시스템 유형을 추측하는 방법을 모르겠습니다 (예 : 확장 된 속성을 설정 한 후 실패 처리)


2

사용하는 한 가지 df단점은 출력의 장치 이름이 길면 줄이 줄 바꿈되므로 마지막 줄을 잡을 수 없다는 것입니다. 대신 첫 번째 줄을 제거한 다음 새 첫 줄을 잡고 첫 번째 필드를 인쇄하십시오.

#!/usr/bin/env bash

path=$1
curdir=$(pwd)
cd $path
df . | tail -n +2 | head -1 | awk '{print $1}'
cd $curdir

3
'df -P'를 사용하여 POSIX 형식으로 출력하고 줄 바꿈없이이 문제를 피하십시오.
MikeyB 2009

2

Linux에서는 df 및 btrfs에 문제가있는 것 같습니다. df에게 마운트 된 btrfs 볼륨의 마운트 지점을 찾도록 요청하면 올바른 작업을 수행합니다. 이 경우 joe는 / m / whale / backup의 하위 디렉토리입니다.

# df /srv/backup/joe
Filesystem      1K-blocks      Used  Available Use% Mounted on
/dev/md126     2930135488 307676684 2619663252  11% /m/whale/backup

그러나 참조되는 디렉토리가 하위 볼륨 인 경우 더 이상 마운트 지점을 알려주지 않습니다.

# df /srv/backup/joe/code
Filesystem      1K-blocks      Used  Available Use% Mounted on
-              2930135488 307676684 2619663252  11% /a/whale/backup/joe/code

/ a / whale / backup은 커널에 따라 유일한 마운트 지점입니다.

# mount | grep whale
/dev/md126 on /a/whale/backup type btrfs (rw,relatime,space_cache)

Fstat, stat도 같은 일을합니다 :

# stat --printf '%m\n' /srv/backup/joe/code
/a/whale/backup/joe/code

1

에서 /programming/2167558/give-the-mount-point-of-a-path :

 df -P $path  | tail -1 | awk '{ print $NF}'

* BSD 및 sysV 및 엉뚱한 자동 마운트 디렉토리에 대해 테스트 한 모든 곳에서 작동합니다. 실패한 사례에 대해 기뻐합니다.


1
제안 된 코드 df -P $ path | 꼬리 -1 | Solaris의 "df"는 "-P"옵션을 지원하지 않기 때문에 시도한 모든 버전의 Solaris (2.5.1, 8, 9 및 10)에서 awk '{print $ NF}'가 실패합니다.
피터 존 악클

@ 피터 : 나는 내가 생각했던 것보다 덜 기쁘게 생각합니다. 그러나 문제가 사소하지 않다는 것을 아는 것은 흥미 롭습니다. 라이브러리가 문제를 올바르게 해결 한 스크립트 언어로 명령을 작성하는 것이 옳은 일이라고 생각합니다. 예를 들어 Python에는 마운트 지점을 제공하는 os.path.splitunc () 함수가 있으며 Solaris에서 작동한다고 가정합니다.
찰스 스튜어트

@CharlesStewart : 슬프게도, 파이썬에는 그러한 지식이 없습니다. os.path.splitunc()에만 작동 UNC 경로 이며 윈도우에서만 사용할 수 .
Aleksi Torhamo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.