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