Es gibt eine ähnliche Frage zu SO. Die derzeit akzeptierte Antwort von @ephemient schlägt die Verwendung eines ioctl vor genannt fiemap was in linux/Documentation/filesystems/fiemap.txt dokumentiert ist . Zitat aus dieser Datei:
Das fiemap ioctl ist eine effiziente Methode für den Userspace, um Dateiumfangszuordnungen zu erhalten. Anstelle einer Block-für-Block-Zuordnung (wie bmap) gibt fiemap eine Liste von Extents zurück.
Klingt so, als ob dies die Art von Informationen ist, nach denen Sie suchen. Die Unterstützung durch Dateisysteme ist wiederum optional:
Dateisysteme, die Fiemap unterstützen möchten, müssen einen ->fiemap implementieren Rückruf auf ihrem inode_operations Struktur.
Unterstützung für SEEK_DATA und SEEK_HOLE Argumente für lseek Sie erwähnten von Solaris wurde laut Manpage in Linux 3.1 hinzugefügt, also könnten Sie das auch verwenden. Die fiemap ioctl scheint älter zu sein, daher ist es vorerst möglicherweise besser auf verschiedene Linux-Versionen übertragbar, während lseek könnte besser über Betriebssysteme hinweg portierbar sein, wenn Solaris dasselbe hat.
Es gibt eine Sammlung von Python-Programmen namens sparseutils, die SEEK_HOLE verwenden und SEEK_DATA um zu bestimmen, welche Abschnitte der Datei als Löcher dargestellt werden und welche Daten sind. Die Nutzung ist recht einfach. mksparse kann verwendet werden, um eine Sparse-Datei gemäß einem bestimmten Layout zu generieren.
$ echo hole,data,hole | mksparse --hole-size 4096 --data-size 4096 example
$ du -sh example
4.0K example
Die sparsemap Programm kann verwendet werden, um das Layout auf stdout zu drucken:
$ sparsemap example
HOLE 4096
DATA 4096
HOLE 4096