Gostaria de verificar, em um script bash, em que tipo de sistema de arquivos é um diretório.
A ideia é algo como
if [path] is on a [filesystem] filesystem then
filesystem specific command
end if
Gostaria de verificar, em um script bash, em que tipo de sistema de arquivos é um diretório.
A ideia é algo como
if [path] is on a [filesystem] filesystem then
filesystem specific command
end if
Respostas:
Use df
. Você pode passar um caminho para ele, e ele fornecerá as informações do sistema de arquivos para esse caminho. Se você precisar do tipo de sistema de arquivos, use o -T
switch da seguinte maneira:
$ df -T test
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/sda2 ext4 182634676 32337180 141020160 19% /home
Para extrair o tipo de sistema de arquivos, você pode analisá-lo (use a -P
opção para evitar df
quebras de linhas se a parte do dispositivo for muito longa):
$ df -PT test | awk 'NR==2 {print $2}'
ext4
Então você pode usar esse valor em uma if
construção como esta:
if [ "$(df -PT "$path" | awk 'NR==2 {print $2}')" = "ext4" ] ; then
it is an ext4 filesystem
fi
Lembre-se de que a coluna do dispositivo pode conter espaços (mas é raro); nesse caso, a análise falhará.
Em um sistema com o comando stat GNU instalado (como em qualquer distribuição Linux padrão), é possível obter o tipo fs para um determinado arquivo sem exigir nenhuma análise usando o stat
comando:
stat -f -c %T filename
-f
informa stat
para fornecer informações sobre o sistema de arquivos em vez do arquivo e -c %T
define o formato de saída para incluir apenas o tipo de sistema de arquivos legível por humanos ( %T
).
Então você pode usar isso (no bash) como:
if [[ $(stat -f -c %T filename) == ext4 ]]; then
# ext4 specific command
fi
man stat
fornecerá mais informações.
Com findmnt
(parte de util-linux
):
findmnt -no fstype -T /path/to/file
Ao usar a opção
Caminho -T, --targetse o caminho não for um arquivo ou diretório de ponto de montagem,
findmnt
verifique os elementos do caminho na ordem inversa para obter o ponto de montagem. As outras duas opções suprimem a linha do cabeçalho: -n, --noheading
e selecione a (s) coluna (s) a serem listadas:-o, --output
df
from coreutils
tem uma opção semelhante --output=
para imprimir apenas determinados campos, como fstype
por exemplo:
df --output=fstype /path/to/file
não há opção para remover o cabeçalho, então você terá que canalizar a saída para, por exemplo | sed 1d
findmnt
ferramenta atraente , mesmo com saída TUI de desenho de linha. Obrigado!