스파스 파일의 비스파스 부분을 표시하는 방법은 무엇입니까?

스파스 파일의 비스파스 부분을 표시하는 방법은 무엇입니까?

다음을 사용하여 생성된 파일을 상상해 보세요.

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

"test\n"이제 중간에 쓰여진 2테비바이트 파일(디스크에서 4kiB를 차지함)이 생겼습니다 .

"test"전체 파일을 읽지 않고도 효율적으로 복구할 수 있는 방법은 무엇입니까 ?

tr -d '\0' < file

결과를 알려 주겠지만 몇 시간이 걸릴 것입니다.

내가 원하는 것은 파일의 희소하지 않은 부분만 출력하는 것입니다(따라서 "test\n"해당 데이터를 저장하는 디스크에 할당된 4kiB 블록 이상일 가능성이 높습니다).

파일의 어느 부분이 있는지 알아내는 API가 있습니다.할당됨(FIBMAP, FIEMAP, SEEK_HOLE, SEEK_DATA...), 그런데 어떤 도구가 이를 노출합니까?

(적어도 해당 API를 지원하는 OS에 대한) 이식 가능한 솔루션이 있으면 감사하겠습니다.

답변1

지금까지 내가 생각해 낼 수 있는 최선의 방법은 (ksh93, Linux의 범위 기반 파일 시스템에서 1.42.9(일부 이전 버전에는 다른 API가 있음)를 사용함 filefrag) e2fsprogs입니다.

#! /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이를 지원하는 파일 시스템에 대해 FIEMAP ioctl을 사용하여 파일의 범위를 보고합니다.

*unwritten*부분은 기록되었지만 기록되지 않은 (희박하지 않지만 여전히 관심이 없는 0으로 가득 찬) 파일을 다룹니다 fallocated.

최신 버전의 bsdtar또는에서는 이러한 API 중 일부를 사용하여 희소 섹션을 식별하는 파일을 star생성할 수 있습니다 . tar그러면 더 많은 일이 일어날 것입니다가지고 다닐 수 있는그러나 희박하지 않은 섹션을 얻으려면 생성된 tar 파일을 구문 분석해야 합니다.

관련 정보