내가 디렉토리(예: /mnt
)에 있다고 상상해 보세요. 그 중 일부는 다른 파일 시스템의 마운트 지점이고 다른 디렉토리는 동일한 파일 시스템의 합법적인 디렉토리입니다. 두 디렉터리를 구별할 수 있도록 현재 디렉터리의 내용을 나열하는 간단한 명령을 실행할 수 있습니까?
한 가지 가능성은 tree -L 1 -x
동일한 파일 시스템의 해당 폴더만 확장한다는 것입니다. 그러나 해당 폴더가 모두 비어 있는 경우(즉, 빈 파일 시스템이 마운트 지점에 마운트되고 합법적인 디렉터리가 빈 디렉터리인 경우) 작동하지 않습니다. .
(여기서 실제 사용 사례는 btrfs 파일 시스템으로, 어떤 디렉터리가 하위 볼륨이고 어떤 디렉터리가 아닌지 쉽게 식별할 수 있습니다.)
편집하다:친구로부터 이것을 사용하여 df
각 파일의 마운트 지점을 가져오면 다음을 실행하여 다른 파일 시스템의 모든 폴더를 나열할 수 있다는 제안을 받았습니다.
comm -1 -3 \
<(df --output=target . | sort) \
<(df --output=target * | sort | uniq) |
xargs basename -a
이 명령은 마운트 지점을 얻기 위해 모든 파일에 대해 실행되고, df
현재 디렉터리에서 출력을 제거한 다음(헤더도 제거됨), 각 파일의 기본 이름을 검색합니다. df
그러나 이는 특별히 우아하지도 않고 깨지기 쉽습니다(적어도 개행 때문에, 아마도 제가 뭔가를 간과하고 있기 때문일 수도 있습니다). 더 좋은 방법이 있나요?
답변1
나는 이것을 사용할 것이다 df
.
$ cd /usr
$ ls
X11R6 include libexec mdec sbin xobj
bin lib local obj share xsrc
games libdata lost+found ports src
$ for d in *; do test -d "$d" && df -P "$d" | awk -v d="$d" 'FNR>1{print d,$NF}'; done
X11R6 /usr
bin /usr
games /usr
include /usr
lib /usr
libdata /usr
libexec /usr
local /usr/local
lost+found /usr
mdec /usr
obj /usr
ports /usr/ports
sbin /usr
share /usr
src /usr
xobj /usr
xsrc /usr
답변2
그리고통계자료(*가 매우 큰 것으로 확장되면 ARG_MAX가 오버플로될 수 있습니다):
stat -c '%D %n' */ | awk -v no=$(stat -c %D /) ' $1 != no { print $2 }'
그리고찾다:
find . -mindepth 1 -maxdepth 1 -type d -printf '%D\t%P\n' |grep -v "^$(stat -c%d /)" |cut -f2
답변3
Linux에서는 다음을 사용할 수 있습니다.stat
마운트된 각 파일 시스템과 연관된 고유 식별자를 나열합니다.
stat -f -c %i somefile
예를 들어, 현재 디렉터리의 마운트 지점을 나열하려면(파일 이름에 줄바꿈이 없다고 가정) 다음을 실행하면 됩니다.
stat -f -c '%i %n' * | grep -v "^$(stat -f -c %i .)"
zsh에서는 사용할 수 있습니다zsh/stat
기준 치수. 로드한 zmodload zsh/stat
다음
zstat +device *
현재 디렉터리의 마운트 지점을 나열합니다.
zstat +device * | grep -v " $(zstat +device .)"
또는
print -rl -- *(e\''[[ $(zstat +device $REPLY) == '$(zstat +device .)' ]]'\')
예를 들어, 동일한 네트워크 공유를 다른 위치에 마운트하거나 Linux 바인드 마운트를 사용하는 경우와 같이 동일한 파일 시스템의 다양한 보기에 대해 파일 시스템 식별자가 동일합니다. 그러나 btrfs 하위 볼륨에는 자체 식별자가 있습니다.출력 구문 분석df
더 번거롭지만 이러한 제한은 없습니다.