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

答え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 {}

関連情報