Meu problema é decodificar a saída do comando file -s /dev/sdX
no meu sistema (onde /dev/sdX
está o arquivo de dispositivo associado a uma chave USB).
Abaixo, mostrarei a saída do comando file -s /dev/sdX
em que o arquivo de dispositivo /dev/sda1
é uma partição formatada com um FAT32
sistema de arquivos, enquanto o dispositivo /dev/sdb
é uma partição formatada com um NTFS
sistema de arquivos.
Saída de file
comando para um FAT32
sistema de arquivos
No caso do FAT32
sistema de arquivos, a saída do file
comando é:
> file -s /dev/sda1
/dev/sda1: DOS/MBR boot sector, code offset 0x58+2, OEM-ID "mkfs.fat", sectors/cluster 8, Media descriptor 0xf8, sectors/track 62, heads 31, hidden sectors 2048, sectors 1966080 (volumes > 32 MB), FAT (32 bit), sectors/FAT 1920, reserved 0x1, serial number 0x4ba3ff5b, unlabeled
Na saída está presente a informação , FAT (32 bit), sectors/FAT 1920,
que poderia ser suficiente para dizer que o tipo de sistema de arquivos é FAT32, mas no próximo parágrafo mostrarei que a string FAT
também está presente na saída do file
comando no caso de um NTFS
sistema de arquivos.
Saída de file
comando para um NTFS
sistema de arquivos
No caso de um NTFS
sistema de arquivos, a saída do file
comando é:
> file -s /dev/sdb
/dev/sdb: DOS/MBR boot sector, code offset 0x52+2, OEM-ID "NTFS ", sectors/cluster 8, Media descriptor 0xf8, sectors/track 63, heads 255, dos < 4.0 BootSector (0x0), FAT (1Y bit by descriptor); NTFS, sectors/track 63, physical drive 0x80, sectors 15654911, $MFT start cluster 786432, $MFTMirror start cluster 2, bytes/RecordSegment 2^(-1*246), clusters/index block 1, serial number 030fcd5a9fcd56a1c; contains bootstrap BOOTMGR
Nesta saída está presente a informação, ; NTFS,
mas também está presente a string FAT
.
A questão
A partir das saídas anteriores do file -s
comando, como determinar o sistema de arquivos das duas partições com certeza?
EDITAR
Adiciono a saída do file -s
comando para uma exfat
partição e para uma ext4
partição.
Saída de file
paraexfat
> file -s /dev/sdf
/dev/sdf: DOS/MBR boot sector
Neste caso exfat
não está presente na saída.
Saída de file
paraext4
file -s /dev/sdb1
/dev/sdb1: Linux rev 1.0 ext4 filesystem data, UUID=38bc3d5b-381e-4f19-8640-c77d9483882b (needs journal recovery) (extents) (64bit) (large files) (huge files)
Neste caso está presente a informação ext4 filesystem data,
.
Nestes 4 exemplos (FAT32, NTFS, EXFAT, EXT4), a saída do file
comando parece muito diferente para diferentes tipos de sistema de arquivos, por isso é difícil encontrar uma regra simples para decidir o tipo de sistema de arquivos por essa saída.
No caso específico que você mostra, é relativamente simples. Sim,
FAT
pode aparecer em ambos, masNTFS
só aparece em um. Então, basta fazer algo simples como:Claro, isso tem limitações óbvias, incluindo o fato de que marcará todas as partições não NTFS como FAT32. OK, então use uma
if/elif
construção:Mas tudo isso ainda é muito frágil. Por que não usar algo que informe o tipo de sistema de arquivos diretamente? Por exemplo, em um sistema Linux moderno, você deve ter
lsblk
which, combinado com-n
(sem cabeçalhos) e-o FSTYPE
, que deve retornar apenas o tipo de sistema de arquivos. No meu sistema, por exemplo, tenho um único SSD NVMe com 6 partições:Se eu pedir uma específica:
E se eu quiser ver um FAT32:
Compare com a saída muito menos imediatamente útil de
file
(que, a propósito, requersudo
diferente delsblk
):(Passei o texto acima
fold
apenas para evitar a rolagem horizontal aqui.)Então, com
lsblk
tudo o que você precisa para o caso genérico é:Você terá então o tipo de sistema de arquivos do dispositivo na
$fstype
variável.No caso geral, é impossível atribuir um único tipo de sistema de arquivos exclusivo a um dispositivo de bloco, por dois motivos:
Diante do exposto, é impossível determinar, com certeza, o tipo de sistema de arquivos de uma partição a partir das saídas do
file -s
comando Linux ou de qualquer outro comando , pois o tipo de sistema de arquivos de uma partição é um conceito indefinido. Uma partição pode conter vários sistemas de arquivos ao mesmo tempo, ou nenhum sistema de arquivos.