find 명령을 사용하여 마운트 지점을 찾으시겠습니까?

find 명령을 사용하여 마운트 지점을 찾으시겠습니까?

Linux에서 트리에서 마운트 지점을 재귀적으로 검색하는 방법이 있습니까? 나는 이런 일을하고 싶다 :

find /tree -type mountpoint | sort -r | xargs umount

답변1

명령 이 있고 mountpoint이를 지원하는 경우 -q다음을 수행할 수 있습니다.

find /tree -depth ! -type l -exec mountpoint -q {} \; -print

그러나 이는 mountpointnon-symlink 파일당 하나의 명령을 실행하는 것을 의미합니다.

파일 시스템이 마운트 지점을 차단하면 적어도 Linux에서는 mountpoint오류가 발생할 수 있습니다 . 예를 들어, 한 파일 시스템이 에 마운트되었지만 /a/b다른 파일 시스템이 나중에 마운트되어 디렉토리 /a도 포함하는 경우 마운트 지점이 아니더라도 해당 파일 시스템이 마운트 지점으로 주장됩니다 . (그러나 실제 생활에서는 이런 일이 거의 발생하지 않습니다.)bmountpoint/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 {}

관련 정보