Obtenha o espaço livre disponível no diretório atual no Bash

25

Eu sei df -he pwd, mas parece um pouco complexo para a parte correspondente de regex. Alguma ideia?

Cheng
fonte
1
Você quis dizer du -h?
jweyrich

Respostas:

45

A saída pode ser um pouco mais fácil de analisar usando a -Popção que garantirá que:

  1. As informações sobre cada sistema de arquivos são sempre impressas em exatamente uma linha; um dispositivo de montagem nunca é colocado em uma linha sozinho. Isso significa que, se o nome do dispositivo de montagem tiver mais de 20 caracteres (por exemplo, para algumas montagens de rede), as colunas ficarão desalinhadas.

Isso facilita muito a obtenção do espaço livre disponível:

$ df -Ph . | tail -1 | awk '{print $4}'

( -husa megabytes, gigabytes e assim por diante. Se o seu sistema não possuir, use -ksomente para kilobytes.)

Se passarmos dfum caminho, ele retornará apenas duas linhas: uma linha de cabeçalho e, em seguida, os dados sobre o sistema de arquivos que contém o caminho. Podemos usar a cauda para pegar apenas a segunda linha. Sabemos que o espaço disponível está na 4ª coluna, então pegamos isso com awk. Tudo isso pode ser feito com awk:

$ df -Ph . | awk 'NR==2 {print $4}'

ou muitos outros conjuntos de filtros .

Steven D
fonte
Você pode otimizar seu comando usando a variável de ambiente em $PWDvez de usar a substituição de comandos e remover a necessidade de cauda: df -Ph $PWD | awk 'NR==2{print $4}'
SiegeX
@ SiegeX: Concordo que tudo awké melhor. Incluí o comando mais longo porque queria ter um exemplo de como alguém pode construir uma cadeia de comandos simples para fazer algo mais complicado. Atualizei a resposta para incluir sua melhoria.
Steven D
-Pé padrão (o Pé para POSIX). Mas -hé uma extensão GNU (também existe em alguns outros sistemas, mas, por exemplo, no OpenBSD é incompatível com -P).
Gilles 'SO- stop be evil'
Você pode fazer isso sem sair usando a opção --output = avail: df -h --output=avail . | tail -1
Floyd
"Você pode otimizar seu comando". Na verdade não. A execução de ambos os tubos 10.000 vezes (como em time { I=0; while [ $I -lt 10000 ]; do df -Ph . | awk 'NR==2 {print $4}' > /dev/null; ((I++)); done }) não revela diferença significativa na velocidade, o que não é surpreendente - invocar tailnão é caro e awkserá poupado para pular para o final da entrada ... Pode ter havido uma diferença em o PDP-11 ... #
23418 David Tonhofer
10

Que tal fazer df -h .. Isso fornecerá o espaço livre disponível da partição em que seu diretório de trabalho atual está.

Um pequeno exemplo:

 /usr/local/nagios/libexec # df -h .
 Filesystem            Size  Used Avail Use% Mounted on
 /dev/mapper/vg00-lvol1
                       9.9G  6.1G  3.4G  65% /
cristão
fonte
4

Em bytes:

df --output=avail -B 1 "$PWD" | tail -n 1

Legível por humanos:

df --output=avail -h "$PWD" | tail -n 1

ou

df --output=avail -B 1 "$PWD" |tail -n 1 | numfmt --to="iec"

ou

df --output=avail -B 1 "$PWD" |tail -n 1 | numfmt --grouping
xerostomus
fonte