![희소 파일의 비희소 부분을 표시하는 방법은 무엇입니까?](https://linux55.com/image/52042/%ED%9D%AC%EC%86%8C%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EB%B9%84%ED%9D%AC%EC%86%8C%20%EB%B6%80%EB%B6%84%EC%9D%84%20%ED%91%9C%EC%8B%9C%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
다음 명령으로 생성된 파일을 상상해 보세요.
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를 지원하는 운영 체제의 경우) 이식 가능한 솔루션이 있으면 감사하겠습니다.
답변1
지금까지 내가 생각할 수 있는 가장 좋은 것은 (ksh93, 1.42.9 filefrag
에서 사용됨 e2fsprogs
(일부 이전 버전에는 다른 API가 있음), 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
파일을 지원하는 파일 시스템의 FIEMAP ioctl을 사용하여 파일의 범위를 보고합니다.
이 *unwritten*
섹션에서는 fallocated
작성되었지만 아직 작성되지 않은 파일(희소하지는 않지만 관심이 없는 0으로 가득 찬 파일)을 다룹니다.
bsdtar
또는 최신 버전에서는 이러한 API 중 일부를 사용하여 희박한 부분을 식별하는 파일을 star
생성할 수 있습니다 . tar
이것은 더 많은 것을 만들 것입니다가지고 다닐 수 있는그러나 희소하지 않은 부분을 얻으려면 결과 tar 파일을 구문 분석해야 합니다.