Linux에서 트리에서 마운트 지점을 재귀적으로 검색하는 방법이 있습니까? 나는 이런 일을하고 싶다 :
find /tree -type mountpoint | sort -r | xargs umount
답변1
명령 이 있고 mountpoint
이를 지원하는 경우 -q
다음을 수행할 수 있습니다.
find /tree -depth ! -type l -exec mountpoint -q {} \; -print
그러나 이는 mountpoint
non-symlink 파일당 하나의 명령을 실행하는 것을 의미합니다.
파일 시스템이 마운트 지점을 차단하면 적어도 Linux에서는 mountpoint
오류가 발생할 수 있습니다 . 예를 들어, 한 파일 시스템이 에 마운트되었지만 /a/b
다른 파일 시스템이 나중에 마운트되어 디렉토리 /a
도 포함하는 경우 마운트 지점이 아니더라도 해당 파일 시스템이 마운트 지점으로 주장됩니다 . (그러나 실제 생활에서는 이런 일이 거의 발생하지 않습니다.)b
mountpoint
/a/b
/proc/mounts
각 경로를 (Linux의 경우) 또는 와 일치시키는 것이 더 나을 것입니다 mount
.
좋다:
eval "$(
< /proc/mounts perl -MString::ShellQuote -lane '
BEGIN{@trees = @ARGV; undef @ARGV}
$_ = $F[1]; # mountpoint is on the 2nd field
s/\\(...)/chr oct $1/ge; # unescape \ooo sequences
s/[[\\?*]/\\$&/gs; # escape wildcards
push @mountpoints, $_;
END {
# output the find command to evaluate:
print shell_quote(
"find", @trees, qw{-depth ! -type l ( -path},
shift @mountpoints,
(map {("-o", "-path", $_)} @mountpoints),
")", "-print")
}' /tree /other/tree
)"
( /tree
절대 경로와 심볼릭 링크가 없는 링크여야 합니다. /other/tree
위에서 언급한 것과 동일한 문제가 발생합니다).mountpoint
아래의 파일 시스템만 마운트 해제하려면 의 /tree
항목이 /proc/mounts
설치된 순서대로 표시되므로 마운트 해제하려면 파일 프로세스를 반대로 하면 됩니다.
예를 들어 아래의 모든 FS를 제거합니다 /tree
.
< /proc/mounts perl -l0 -ane '
$_ = $F[1];
s/\\(...)/chr oct $1/ge; # unescape \ooo sequences
unshift @mountpoints, $_ if "$_/" =~ m{^/tree/};
END {print for @mountpoints}' | xargs -r0 umount
마운트 지점에 개행 문자가 포함되어 있지 않다는 것을 알고 있는 경우 다음을 수행할 수도 있습니다.
findmnt -rnRo target /tree | tac | xargs -rd '\n' umount
또는 더 자세하고 명확합니다.
findmnt --raw --noheadings --submounts --output=target /tree |
tac | xargs --no-run-if-empty --delimiter='\n' umount
답변2
이것은 특별히 우아하지는 않지만 작동할 것입니다. 오류를 무시하고 모든 것이 제거될 때까지 계속 시도하세요.
while mount | grep -q /tree; do
mount | awk '/tree/{print $3}' | xargs sudo umount 2>/dev/null
done
위의 내용은 마운트 지점에 공백이나 기타 이상한 문자를 사용하지 않는 정상적인 사람이라고 가정합니다. 그렇지 않은 경우 대신 이 옵션을 사용하십시오(이 옵션은 이름에 둘 다 포함된 on
마운트 지점이 없다고 가정합니다 type
).
while mount | grep -q /tree; do
mount | sed -nE 's/.*\s+on\s+(.*baba.*)\s+type.*/\1/p' |
xargs sudo umount 2>/dev/null
done
답변3
이 시도...
find /tree -depth -type d -inum 2 -print | xargs umount
죄송합니다. 테스트할 수는 없습니다... 하지만 이론에 따르면 모든 파일 시스템의 루트에는 inode 번호 2가 있습니다(적어도 ext[2-4] 및 대부분의 다른 UNIX 유사 파일 시스템의 경우... 이를 확인하려면... /
실행 ls -ldi /
- inode 번호는 왼쪽 열의 번호가 됩니다.
답변4
이를 달성하려면 "mountpoint" 명령을 사용할 수 있습니다. 예를 들어:
find /tree -exec sh -c "mountpoint {} 2>/dev/null" \; | grep "is a mountpoint" | awk '{print $1}'|sort -r | xargs umount {}