Encontrando pontos de montagem com o comando find?

3

Existe uma maneira de pesquisar recursivamente uma árvore para pontos de montagem no Linux? Eu estou procurando fazer algo assim:

find /tree -type mountpoint | sort -r | xargs umount
    
por Naftuli Kay 10.12.2015 / 05:35

4 respostas

5

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
    
por 10.12.2015 / 17:59
0

Isso não é particularmente elegante, mas deve funcionar. Apenas ignore os erros e continue tentando até que tudo seja desmontado:

while mount | grep -q /tree; do 
    mount | awk '/tree/{print $3}' | xargs sudo umount 2>/dev/null
done

O acima assume que você é uma pessoa razoável que não usa espaço em branco ou outros caracteres estranhos em seus pontos de montagem. Se esse não for o caso, use-o (este pressupõe que você não tenha pontos de montagem com nomes que incluam on e type ):

while mount | grep -q /tree; do 
 mount | sed -nE 's/.*\s+on\s+(.*baba.*)\s+type.*//p' | 
    xargs sudo umount 2>/dev/null
done
    
por 10.12.2015 / 22:42
-1

Você pode usar o comando "mountpoint" para conseguir isso. Por exemplo:

find /tree -exec sh -c "mountpoint {} 2>/dev/null" \; | grep "is a mountpoint" | awk '{print $1}'|sort -r | xargs umount {}

Espero que isso ajude.

    
por 10.12.2015 / 14:49
-1

Tente isso ...

find /tree -depth -type d -inum 2 -print | xargs umount

Desculpe, não posso testar isso ... mas a teoria é que a raiz de cada sistema de arquivos terá o número de inode 2 (pelo menos para o ext [2-4] e a maioria dos outros sistemas de arquivos semelhantes a unix ... para confirme isso para / run ls -ldi / - o número do inode será o número na coluna da esquerda).

    
por 10.12.2015 / 14:57

Tags