Come visualizzare le parti non sparse di un file sparse?


8

Immagina un file creato con:

truncate -s1T file
echo test >> file
truncate -s2T file

Ora ho un file da 2 tebibyte (che occupa 4 kB su disco), con "test\n"scritto nel mezzo.

Come potrei ripristinarlo in modo "test"efficiente, cioè senza dover leggere l'intero file.

tr -d '\0' < file

Mi darebbe il risultato ma ciò richiederebbe ore.

Quello che mi piacerebbe è qualcosa che emette solo le parti non sparse del file (quindi solo sopra "test\n"o più probabilmente, il blocco da 4 kB allocato su disco che memorizza quei dati).

Ci sono API per scoprire quale parte del file è allocata (FIBMAP, FIEMAP, SEEK_HOLE, SEEK_DATA ...), ma quali strumenti espongono quelli?

Una soluzione portatile (almeno per i sistemi operativi che supportano tali API) sarebbe apprezzata.


Quanto è efficiente strings?
Glenn Jackman,

@glennjackman, meno che trda quando legge ancora l'intero file e fa di più che rimuovere semplicemente i byte NUL.
Stéphane Chazelas,

Risposte:


6

Il migliore che ho potuto inventare finora è (ksh93, usando filefragda e2fsprogs1.42.9 (alcune versioni precedenti hanno un'API diversa), su file system basati su estensione su 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 riporta le estensioni del file utilizzando lo ioctl FIEMAP per i filesystem che lo supportano.

La *unwritten*parte copre i file (non sparsi, ma ancora pieni di zeri che non mi interessano) che sono stati fallocatedma non sono stati scritti.

Le versioni recenti di bsdtaro starpossono utilizzare alcune di queste API per generare un tarfile che identifica le sezioni sparse in quanto tali. Ciò renderebbe una soluzione più portatile , ma si dovrebbe analizzare il file tar generato per ottenere le sezioni non sparse.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.