Làm cách nào để hiển thị các phần không thưa thớt của một tệp thưa?


8

Hãy tưởng tượng một tập tin được tạo bằng:

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

Bây giờ tôi có một tệp 2 tebibyte (chiếm 4kiB trên đĩa), với "test\n"chữ viết ở giữa.

Làm thế nào tôi có thể phục hồi "test"hiệu quả, đó là mà không cần phải đọc toàn bộ tập tin.

tr -d '\0' < file

Sẽ cho tôi kết quả nhưng sẽ mất nhiều giờ.

Những gì tôi muốn là một cái gì đó chỉ xuất ra các phần không thưa thớt của tệp (vì vậy, trên hết "test\n"hoặc nhiều khả năng, khối 4kiB được phân bổ trên đĩa lưu trữ dữ liệu đó).

Có các API để tìm ra phần nào của tệp được phân bổ (FIBMAP, FIEMAP, SEEK_HOLE, SEEK_DATA ...), nhưng công cụ nào phơi bày những phần đó?

Một giải pháp di động (ít nhất là cho các HĐH hỗ trợ các API đó) sẽ được đánh giá cao.


Làm thế nào là hiệu quả strings?
glenn jackman

@glennjackman, ít hơn trvì nó vẫn đọc toàn bộ tệp và không chỉ xóa các byte NUL.
Stéphane Chazelas

Câu trả lời:


6

Điều tốt nhất tôi có thể nghĩ ra cho đến nay là (ksh93, sử dụng filefragtừ e2fsprogs1.42.9 (một số phiên bản cũ hơn có API khác nhau), trên các hệ thống tệp dựa trên phạm vi trên 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 báo cáo mức độ mở rộng của tệp bằng cách sử dụng FIEMAP ioctl cho các hệ thống tệp hỗ trợ tệp.

Phần *unwritten*này bao gồm các tệp (không thưa thớt, nhưng vẫn đầy các số không tôi không quan tâm) các tệp đã được fallocatednhưng không được ghi vào.

Các phiên bản gần đây của bsdtarhoặc starcó thể sử dụng một số API đó để tạo tartệp xác định các phần thưa thớt như vậy. Điều đó sẽ làm cho một giải pháp di động hơn , nhưng sau đó người ta sẽ phải phân tích tệp tar được tạo để có được các phần không thưa thớt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.