findコマンドを使用してマウントポイントを見つけますか?

findコマンドを使用してマウントポイントを見つけますか?

Linuxでツリーからマウントポイントを再帰的に取得する方法はありますか?私はこのようなことをしたい:

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

ベストアンサー1

コマンドがあり、mountpointそれをサポートしている場合は、-q次のことができます。

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

ただし、これはmountpoint非同期リンクファイルごとに1つのコマンドを実行することを意味します。

ファイルシステムがマウントポイントをブロックすると、少なくとも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

おすすめ記事