Se você tem um comando mountpoint
e ele suporta -q
, você pode fazer:
find /tree -depth ! -type l -exec mountpoint -q {} \; -print
Mas isso significa executar um comando mountpoint
por arquivo não-symlink.
Note que pelo menos o Linux mountpoint
pode errar quando um sistema de arquivos está mascarando um ponto de montagem. Por exemplo, se um fs estiver montado em /a/b
, mas um fs diferente for montado em /a
depois e também contiver um diretório b
, então mountpoint
solicitará /a/b
é um ponto de montagem, embora não é. (Isso raramente aconteceria na vida real).
Provavelmente seria melhor comparar cada caminho com pontos de montagem listados em /proc/mounts
(se no Linux) ou a saída de mount
.
Como:
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
e /other/tree
têm que ser caminhos absolutos e livres de links simbólicos. Isso sofre do mesmo problema que mountpoint
mencionado acima).
Se tudo o que você deseja é desmontar os sistemas de arquivos em /tree
, observe que as entradas em /proc/mounts
aparecem na ordem em que foram montadas; portanto, para desmontá-las, basta processá-las ao contrário:
Por exemplo, para desmontar todo o FS em /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
Se você sabe que os pontos de montagem não contêm caracteres de nova linha, você também pode fazer:
findmnt -rnRo target /tree | tac | xargs -rd '\n' umount
Ou mais verbosa / legivelmente:
findmnt --raw --noheadings --submounts --output=target /tree |
tac | xargs --no-run-if-empty --delimiter='\n' umount