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
含まれている場合、マウントポイントではなくてもファイルシステムはマウントポイントとして主張されます。 (しかし、実際の生活ではこれはほとんど起こりません。)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