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