Podobná otázka je na SO. Aktuálně přijímaná odpověď od @ephemien navrhuje použití ioctl
s názvem fiemap
což je zdokumentováno v linux/Documentation/filesystems/fiemap.txt
. Cituji z tohoto souboru:
fiemap ioctl je efektivní metoda pro uživatelský prostor pro získání mapování rozsahu souborů. Místo mapování blok po bloku (jako je bmap) vrací fiemap seznam oblastí.
Zní to, že to je druh informací, které hledáte. Podpora souborovými systémy je opět volitelná:
Souborové systémy, které chtějí podporovat fiemap, musí implementovat
->fiemap
zpětné volání na jejichinode_operations
struktura.
Podpora pro SEEK_DATA
a SEEK_HOLE
argumenty na lseek
zmiňovaný ze Solarisu byl přidán do Linuxu 3.1 podle manuálové stránky, takže to můžete také použít. fiemap ioctl
Zdá se, že je starší, takže může být prozatím lépe přenosný v různých verzích Linuxu, zatímco lseek
může být přenosnější mezi operačními systémy, pokud má Solaris totéž.
Existuje sbírka pythonových programů nazvaných sparseutils, které používají SEEK_HOLE
a SEEK_DATA
určit, které části souboru jsou reprezentovány jako díry a které jsou data. Použití je celkem přímočaré. mksparse
lze použít ke generování řídkého souboru podle určitého rozvržení.
$ echo hole,data,hole | mksparse --hole-size 4096 --data-size 4096 example
$ du -sh example
4.0K example
sparsemap
program lze použít k tisku rozvržení na stdout:
$ sparsemap example
HOLE 4096
DATA 4096
HOLE 4096