Bagaimana cara menampilkan bagian yang tidak jarang dari file jarang?

8

Bayangkan sebuah file dibuat dengan:

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

Saya sekarang memiliki file 2 tebibyte (yang menempati 4kiB pada disk), dengan "test\n"tulisan di tengah.

Bagaimana saya memulihkannya secara "test"efisien, yaitu tanpa harus membaca seluruh file.

tr -d '\0' < file

Akan memberi saya hasilnya tetapi itu akan memakan waktu berjam-jam.

Yang saya suka adalah sesuatu yang hanya menampilkan bagian file yang tidak jarang (jadi hanya di atas "test\n"atau lebih mungkin, blok 4kiB dialokasikan pada disk yang menyimpan data itu).

Ada API untuk mengetahui bagian mana dari file yang dialokasikan (FIBMAP, FIEMAP, SEEK_HOLE, SEEK_DATA ...), tetapi alat apa yang memaparkannya?

Solusi portabel (setidaknya untuk OS yang mendukung API tersebut) akan dihargai.

Stéphane Chazelas
sumber
Seberapa efisien strings?
glenn jackman
@glennjackman, kurang dari trsejak masih membaca seluruh file dan melakukan lebih dari sekadar menghapus byte NUL.
Stéphane Chazelas

Jawaban:

6

Yang terbaik yang bisa saya dapatkan sejauh ini adalah (ksh93, menggunakan filefragdari e2fsprogs1.42.9 (beberapa versi yang lebih lama memiliki API yang berbeda), pada sistem file berbasis luas di 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 melaporkan luasan file menggunakan FIEMAP ioctl untuk sistem file yang mendukungnya.

Bagian *unwritten*mencakup untuk (non-jarang, tetapi masih penuh dengan nol saya tidak tertarik) file yang telah fallocatedtetapi tidak ditulis.

Versi terbaru bsdtaratau stardapat menggunakan beberapa API tersebut untuk menghasilkan tarfile yang mengidentifikasi bagian yang jarang. Itu akan membuat solusi yang lebih portabel , tetapi kemudian orang harus mengurai file tar yang dihasilkan untuk mendapatkan bagian yang tidak jarang.

Stéphane Chazelas
sumber