Imaginez un fichier créé avec:
truncate -s1T file
echo test >> file
truncate -s2T file
J'ai maintenant un fichier de 2 tebibytes (qui occupe 4 Ko sur le disque), avec "test\n"
écrit au milieu.
Comment pourrais-je récupérer cela "test"
efficacement, c'est-à-dire sans avoir à lire tout le fichier.
tr -d '\0' < file
Me donnerait le résultat mais cela prendrait des heures.
Ce que j'aimerais, c'est quelque chose qui ne génère que les parties non clairsemées du fichier (donc ci-dessus uniquement "test\n"
ou plus probablement, le bloc de 4 Ko alloué sur le disque qui stocke ces données).
Il existe des API pour savoir quelle partie du fichier est allouée (FIBMAP, FIEMAP, SEEK_HOLE, SEEK_DATA ...), mais quels outils les exposent?
Une solution portable (au moins pour les OS qui prennent en charge ces API) serait appréciée.
text-processing
sparse-files
Stéphane Chazelas
la source
la source
strings
?tr
parce qu'il lit toujours le fichier entier et fait plus que simplement supprimer les octets NUL.Réponses:
Le meilleur que j'ai pu trouver jusqu'à présent est (ksh93, à
filefrag
partir de la versione2fsprogs
1.42.9 (certaines anciennes versions ont une API différente), sur des systèmes de fichiers basés sur l'étendue sous Linux):filefrag
signale l'étendue du fichier à l'aide de l'ioctl FIEMAP pour les systèmes de fichiers qui le prennent en charge.La
*unwritten*
partie couvre les fichiers (non clairsemés, mais toujours pleins de zéros qui ne m'intéressent pas) qui ont étéfallocated
mais non écrits.Les versions récentes de
bsdtar
oustar
peuvent utiliser certaines de ces API pour générer untar
fichier qui identifie les sections éparses en tant que telles. Cela rendrait la solution plus portable , mais il faudrait alors analyser le fichier tar généré pour obtenir les sections non éparses.la source