informações de montagem para o diretório atual

20

Eu posso fazer df .para obter algumas informações sobre a montagem em que o diretório atual está, e posso obter todas as informações que desejo mount, mas obter muitas informações (informações sobre outras montagens). Posso cumpri-lo, mas estou me perguntando se existe uma maneira melhor.

Existe algum comando mountinfoque mountinfo .dê as informações que eu quero (como df ., mas com as informações que mountdá).


Estou usando o Debian Gnu + Linux.

ctrl-alt-delor
fonte
11
Eu acredito que o statcomando pode ser usado também. No entanto, não tenho certeza se a %mopção que fornece o ponto de montagem é suportada na sua versão do sistema. Fiz o check-in no meu sistema e parecia não retornar o ponto de montagem.
Ramsh
11
@Ramesh, Yes stat "--printf=%m\n" .obtém o ponto de montagem do sistema de arquivos em que o diretório atual se encontra. Assim, simplificamos algumas das respostas. Obrigado.
Ctrl-alt-delor

Respostas:

18

Eu acho que você quer algo assim:

findmnt -T .

Ao usar a opção

Caminho -T, --target
se o caminho não for um arquivo ou diretório de ponto de montagem, findmntverifica os elementos do caminho na ordem inversa para obter o ponto de montagem. Você pode imprimir apenas determinados campos via -o, --output [list].
Veja findmnt --helpa lista de campos disponíveis.


Como alternativa, você pode executar:

(until findmnt . ; do cd .. ; done)

O problema que você está enfrentando é que todos os caminhos são relativos a uma coisa ou outra, então você só precisa andar na árvore. Toda vez.

findmnté um membro do pacote util-linux e já existe há alguns anos. Até agora, independentemente da sua distribuição, ela já deve estar instalada na sua máquina Linux se você também tiver a mountferramenta.

man mount | grep findmnt -B1 -m1
For  more robust and customizable output use
findmnt(8),  especially  in  your   scripts.

findmntimprimirá as informações de todas as montagens sem um argumento de ponto de montagem, e somente isso para seu argumento com um. A -Dé a opção emulardf . Sem -Dsua saída, é semelhante ao mount's - mas muito mais configurável. Tente findmnt --helpe veja por si mesmo.

Coloco em um subshell para que o diretório atual do shell atual não seja alterado.

Então:

mkdir -p /tmp/1/2/3/4/5/6 && cd $_ 
(until findmnt . ; do cd .. ; done && findmnt -D .) && pwd

RESULTADO

TARGET SOURCE FSTYPE OPTIONS
/tmp   tmpfs  tmpfs  rw
SOURCE FSTYPE  SIZE   USED AVAIL USE% TARGET
tmpfs  tmpfs  11.8G 839.7M   11G   7% /tmp
/tmp/1/2/3/4/5/6

Se você não tem a -Dopção disponível (não nas versões mais antigas do util-linux), então não precisa ter medo - é pouco mais do que uma opção de conveniência em qualquer caso. Observe os títulos das colunas que produz para cada chamada - você pode incluir ou excluir os títulos de cada chamada com a -oopção utput. Posso obter a mesma saída que -Dpode fornecer como:

 findmnt /tmp -o SOURCE,FSTYPE,SIZE,USED,AVAIL,USE%,TARGET

RESULTADO

SOURCE FSTYPE  SIZE  USED AVAIL USE% TARGET
tmpfs  tmpfs  11.8G  1.1G 10.6G  10% /tmp
mikeserv
fonte
Eu gosto, exceto que pouco -D, eu não tenho essa opção. (Estou no Debian7, util-linux 2.20.1-5.3)
ctrl-alt-delor
Eu √ você em alguns dias, deixarei algum tempo para ver se alguém tem uma resposta mais perfeita. Embora isso esteja quase perfeito (se funcionasse como df: não precisava do loop, seria perfeito).
Ctrl-alt-delor 12/08/14
@richard - é uma boa ideia - não gosto quando as respostas são aceitas muito cedo. em relação ao loop e df- estou disposto a apostar que ele faz loop, você não precisa dizer para fazê-lo.
precisa saber é o seguinte
11
Graças a @ramesh, também podemos fazerfindmnt $(stat "--printf=%m\n" .)
ctrl-alt-delor
2
Minha versão do findmntpossui uma -Topção que pode ignorar o cd ..loop. Pode ser útil para outra pessoa.
nitrogênio
1

A maneira Linux / Unix é ter uma caixa de ferramentas de pequenos utilitários que, quando combinados, fornecem os resultados que você procura.

Eles tendem a não ter utilidade para todas as ocasiões. Em vez disso, você tem muitos pequenos utilitários úteis que são combinados com pipes etc. A vantagem disso é que você pode escrever seu próprio utilitário com bastante facilidade se não houver nenhum disponível.

Por exemplo, para obter as informações que você procura, você pode usar:

mount | grep $(df  --output=source . | tail -1)

Se você deseja reutilizar o acima com diretórios diferentes, crie um script:

#!/bin/bash
mount | grep $(df  --output=source $1 | tail -1)

Salve-o como mountinfoe torne-o executável ( chmod +x mountinfo). Você pode usá-lo como:

mountinfo .

Se você deseja um sistema que tenha utilidade para tudo que não interaja, um certo Sr. Gates poderá ajudá-lo ;-)

garethTheRed
fonte
--outputsó existe em versões muito recentes do GNU coreutils (≥8.22).
Gilles 'SO- stop being evil' (
Isso é praticamente o que eu tenho feito, é que, mountsem opções, parece um pouco tardio: com as opções, você cria pontos de montagem, sem que eles os listem, eu esperava uma ferramenta de lista melhor. Como vemos, o @mikeserv nos mostrou findmnt.
Ctrl-alt-delor 13/08/14
1

Pode ser um pouco confuso se os pontos de montagem contiverem espaços em branco, mas isso deve funcionar, exceto nos casos em que os pontos de montagem contenham novas linhas:

#!/bin/sh
mountpoint="$(df -P "$1" | awk '{
    if (NR==1)
        i=index($0,"Mounted on");
    else
        print substr($0,i);
    }')"
mount|grep " on ${mountpoint} type "

df -Pgera uma linha para o sistema de arquivos; sem essa opção, dfpode gerar duas linhas se o ponto de montagem for longo. O nome do ponto de montagem começa na mesma coluna que o rótulo "Montado em" na linha do cabeçalho.

Depois de obtermos o ponto de montagem, nós o saudamos na saída de mount.

Mark Plotnick
fonte
1

Não conheço um comando, mas você pode criar uma função. Você pode adicionar o seguinte ao seu .bashrc:

mountinfo () {
  mount | grep $(df -P "$1" | tail -n 1 | awk '{print $1}')
}

Isso executa o mountcomando e passa a saída para grep. grepirá procurar a saída de df -P "$1" | tail -n 1 | awk '{print $1}', e decompô-la:

  • df -P "$1"será executado dfno argumento passado para a função,
  • tail -n 1apenas produzirá a segunda linha, a que contém as partitioninformações.
  • awk '{print $1}'imprimirá a primeira parte dessa linha, que é o número do disco / partição, por exemplo /dev/sda5. É o que grepprocurará no comando mount e o produzirá.

Crie seu .bashrcarquivo para aplicar as alterações ou efetue logout e logon novamente.

Agora, se você executar mountinfo ., obterá a saída desejada.

Alaa Ali
fonte
Isso é basicamente o que tenho feito (mas sem a função, não o faço o suficiente, quando o faço em outros sistemas, por exemplo, respostas neste site.), É que, mountsem opções, parece um pouco uma reflexão tardia: com as opções de criação de pontos de montagem, sem que sejam listados, eu esperava uma ferramenta de lista melhor. Como vemos, o @mikeserv nos mostrou findmnt.
Ctrl-alt-delor 13/08/14
0

Se você estiver usando uma versão não completamente antiga do GNU coreutils df, então echo $(df . --output=target | tail -n 1)funcionará. Da mesma forma stat -c '%m' ., embora observe que https://linux.die.net/man/1/stat não possui documentação da %mopção de formato.

Fazer isso de maneira portável é cansativo: nenhuma das opções acima funcionará com as versões BSD ou Cygwin do stat ou df. Se não fosse a possibilidade de espaços nos caminhos dos pontos de montagem, df -P . | tail -1 | awk '{ print $NF}'seria bom, mas geralmente as unidades flash USB possuem espaços no nome do volume, o que provavelmente aparecerá no caminho da montagem e interromperá isso. Para portabilidade, o Perl é instalável praticamente em qualquer lugar e o CPAN possui o módulo Sys :: Filesystem :: MountPoint, que fornece a funcionalidade desejada.

Charles Stewart
fonte
Você pode nos dizer o que isso echo $()adiciona ao comando?
ctrl-alt-delor 12/12