Comment afficher les parties non clairsemées d'un fichier clairsemé?

8

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.

Stéphane Chazelas
la source
Quelle est son efficacité strings?
glenn jackman
@glennjackman, moins que trparce qu'il lit toujours le fichier entier et fait plus que simplement supprimer les octets NUL.
Stéphane Chazelas

Réponses:

6

Le meilleur que j'ai pu trouver jusqu'à présent est (ksh93, à filefragpartir de la version e2fsprogs1.42.9 (certaines anciennes versions ont une API différente), sur des systèmes de fichiers basés sur l'étendue sous Linux):

#! /bin/ksh93
export LC_ALL=C
for file do
filefrag -vb1 -- "$file" |
  while IFS=": ." read -A a; do
    [[ $a = +([0-9]) ]] && [[ ${a[@]} != *unwritten* ]] &&
      command /opt/ast/bin/head -s "${a[1]}" -c "${a[7]}" -- "$file"
  done
done

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é fallocatedmais non écrits.

Les versions récentes de bsdtarou starpeuvent utiliser certaines de ces API pour générer un tarfichier 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.

Stéphane Chazelas
la source