원래 희박한 다음 확장 된 파일을 다시 희박하게 만들 수 있습니까?


29

스파 스 파일을 이해하는 유틸리티를 사용하지 않고 원래 스파 스 파일을 복사하거나 전송하면 '구멍'이 채워질 것입니다. 한때 희소 파일을 희소로 되 돌리는 방법이나 유틸리티가 있습니까?

예를 들어 :
희소 파일 작성 :

% dd if=/dev/zero of=TEST bs=1 count=0 seek=1G
# do some op that pads out the holes
% scp TEST localhost:~/TEST2
% ls -lhs TEST*
   0 -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:35 TEST
1.1G -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:37 TEST2

방법이 있습니까?

% resparse TEST2
to get:
   0 -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:35 TEST
  0G -rw-rw-r--. 1 tony tony 1.0G Oct 16 13:37 TEST2

죄송합니다, 원래 질문을 예쁘게해야했습니다 ...
user25849

1
내가 본 모든 것에서 이것을 할 수있는 유일한 것은 '% cp --sparse = always previous-sparse-file newly-sparse-file'에서와 같이 GNU 'cp'입니다. 제자리에.
user25849

희소 파일을 복사하고 사본을 희소하게하려면을 사용하십시오 rsync -aS.
Gilles 'SO- 악마 그만해

답변:


30

2015 년 편집

util-linux 2.25부터 fallocateLinux 의 유틸리티에는 -d/ --dig-hole옵션이 있습니다.

fallocate -d the-file

파일에서 0 으로 가득 찬 모든 블록에 구멍을 파십시오.


구형 시스템에서는 직접 수행 할 수 있습니다.

리눅스는 이것을 할 수 있는 FALLOC_FL_PUNCH_HOLE옵션 fallocate이 있습니다. 예를 들어 github에서 스크립트를 찾았습니다.

파이썬에서 FALLOC_FL_PUNCH_HOLE 사용

0으로 채워진 파일 영역에 구멍을 뚫어 요청 한대로 약간 수정했습니다. 여기있어:

파이썬에서 FALLOC_FL_PUNCH_HOLE을 사용하여 파일에 구멍을 뚫기

usage: punch.py [-h] [-v VERBOSE] FILE [FILE ...]

Punch out the empty areas in a file, making it sparse

positional arguments:
  FILE                  file(s) to modify in-place

optional arguments:
  -h, --help            show this help message and exit
  -v VERBOSE, --verbose VERBOSE
                        be verbose

예:

# create a file with some data, a hole, and some more data
$ dd if=/dev/urandom of=test1 bs=4096 count=1 seek=0
$ dd if=/dev/urandom of=test1 bs=4096 count=1 seek=2

# see that it has holes
$ du --block-size=1 --apparent-size test1
12288   test1
$ du --block-size=1 test1
8192    test1

# copy it, ignoring the hole
$ cat test1 > test2
$ du --block-size=1 --apparent-size test2
12288   test2
$ du --block-size=1 test2
12288    test2

# punch holes again
$ ./punch.py test2
$ du --block-size=1 --apparent-size test2
12288   test2
$ du --block-size=1 test2
8192    test2

# verify
$ cmp test1 test2 && echo "files are the same"
files are the same

punch.py당신이 시작했을 때 그것이로 정확하게 스파 스 같은 파일을되지 않을 수도 있습니다 만 4096 바이트의 블록을 발견은, 펀치 아웃합니다. 물론 더 똑똑해질 수 있습니다. 또한 가벼운 테스트 만 수행 하므로 신뢰하기 전에 주의해서 백업 하십시오!


1
전체 파일을 다시 작성할 필요가 없기 때문에 이것이 가장 좋습니다.
Peter

8

파일을 스파 스로 만들고 싶다면 다음을 사용하여 직접 할 수 있습니다. dd .

dd if=./zeropadded.iso of=./isnowsparse.iso conv=sparse

로부터 dd(1) 수동 :

          sparse   If one or more output blocks would consist solely of
                   NUL bytes, try to seek the output file by the required
                   space instead of filling them with NULs, resulting in a
                   sparse file.

따라서 전체 블록이 비어있는 경우에만 계속 탐색합니다. 최대한의 비장을 위해 사용하십시오 bs=1.


2
bs=512디스크는 블록 장치이므로 실제로는 의미가없는 것보다 작은 블록 크기 입니다. ( bs=4096최신 드라이브)
lapo

이 같은 모습은 동일합니다cp --sparse=always zeropadded.iso isnowsparse.iso
maxschlepzig

2

짧은 tar와 그것을 -ing -S플래그 (GNU 타르 가정),과를 다시 실행 scp아니 .... 내가 아는 어떤 유틸리티도 "구멍"이 어디에 있는지 알 수있는 방법이 없습니다.


5
GNU cp는 파일을 다시 분석합니다 : 맨 페이지에서 : --sparse = always를 지정하여 SOURCE 파일에 충분한 길이의 0 바이트 시퀀스가있을 때마다 스파 ​​스 DEST 파일을 만듭니다.
user25849

대단해 그 깃발은 언제 소개 되었습니까? 한 번에 "잘 알려진"프로그램의 인간이 페이지를 읽기 위해 지불 한 동안; D
팅크

2

나는 이것으로 행운을 빕니다.

cd whatever
rsync -avxWSHAXI . .

-I힘에 관계없이 그들이 변경 여부를 한 생각 여부에 모든 파일을 업데이트 rsync는; 는 -S새로운 파일이 sparsified되도록합니다.-a한 번의 명령으로 전체 디렉토리 트리를 희소화할 수 있습니다.

구멍을 찾아서 제거하는 맞춤형 도구만큼 좋지는 FALLOC_FL_PUNCH_HOLE않지만 전체 디렉토리 트리를 복제하는 것보다 낫습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.