unix .tar.gz 파일이 압축되지 않은 유효한 파일인지 확인하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/2001709

  •  18-09-2019
  •  | 
  •  

문제

나는 질문을 찾았다 데이터가 파일이없는 유효한 TAR 파일인지 확인하는 방법은 무엇입니까?, 그러나 나는 궁금했다. 기성품 명령 줄 솔루션이 있습니까?

도움이 되었습니까?

해결책

파일을 압축하는 대신 타르볼 목록을 얻고 출력을 버리는 것은 어떻습니까?

tar -tzf my_tar.tar.gz >/dev/null

주석에 따라 편집. 감사합니다 Zrajm!

주석에 따라 편집. 고마워 Frozen Flame! 이 테스트는 결코 데이터의 무결성을 의미하지 않습니다. 테이프 아카이브 유틸리티로 설계되었으므로 대부분의 TAR 구현은 동일한 파일의 여러 사본을 허용합니다!

다른 팁

아마도 gzip -t 옵션을 사용하여 파일 무결성을 테스트 할 수 있습니다.

http://linux.about.com/od/commands/l/blcmdl1_gzip.htm

에서: http://unix.ittoolbox.com/groups/technical-functional/shellscript-l/how-to-test-file-integrity-of-targz-1138880

GZIP 파일을 테스트하려면 손상되지 않습니다.

gunzip -t file.tar.gz

내부의 TAR 파일을 테스트하려면 손상되지 않습니다.

gunzip -c file.tar.gz | tar t > /dev/null

백업의 일부로 후자의 명령을 실행하고 $의 값을 확인할 수 있습니까? 그 후 0 (성공) 값에 대해. 타르 또는 gzip에 문제가있는 경우 $? 0이 아닌 값이 있습니다.

디스크를 추출하지 않고 TAR 파일의 실제 테스트 추출물을 수행하려면 -o 옵션을 사용하십시오. 이것은 파일 시스템 대신 추출물을 표준 출력으로 뿌립니다. TAR 파일이 손상되면 프로세스가 오류로 중단됩니다.

실패한 타르 볼 테스트의 예 ...

$ echo "this will not pass the test" > hello.tgz
$ tar -xvzf hello.tgz -O > /dev/null
gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error exit delayed from previous errors
$ rm hello.*

작업 예 ...

$ ls hello*
ls: hello*: No such file or directory
$ echo "hello1" > hello1.txt
$ echo "hello2" > hello2.txt
$ tar -cvzf hello.tgz hello[12].txt
hello1.txt
hello2.txt
$ rm hello[12].txt
$ ls hello*
hello.tgz
$ tar -xvzf hello.tgz -O
hello1.txt
hello1
hello2.txt
hello2
$ ls hello*
hello.tgz
$ tar -xvzf hello.tgz
hello1.txt
hello2.txt
$ ls hello*
hello1.txt  hello2.txt  hello.tgz
$ rm hello*

*.tag.gz 파일의 내용을 확인할 수도 있습니다. pigz (병렬 GZIP) 아카이브 점검 속도를 높이기 위해 :

pigz -cvdp number_of_threads /[...]path[...]/archive_name.tar.gz | tar -tv > /dev/null

나는 다음 명령을 시도했고 잘 작동합니다.

bzip2 -t file.bz2
gunzip -t file.gz

그러나이 두 명령이 시간이 많이 걸리는 것을 발견 할 수 있습니다. 아마도 압축 파일의 손상을 결정하려면 더 빠른 방법이 필요할 수 있습니다.

좋은 옵션은 사용하는 것입니다 tar -tvvf <filePath> 파일의 종류를보고하는 줄을 추가합니다.

유효한 .tar 파일의 예 :

> tar -tvvf filename.tar 
drwxr-xr-x  0 diegoreymendez staff       0 Jul 31 12:46 ./testfolder2/
-rw-r--r--  0 diegoreymendez staff      82 Jul 31 12:46 ./testfolder2/._.DS_Store
-rw-r--r--  0 diegoreymendez staff    6148 Jul 31 12:46 ./testfolder2/.DS_Store
drwxr-xr-x  0 diegoreymendez staff       0 Jul 31 12:42 ./testfolder2/testfolder/
-rw-r--r--  0 diegoreymendez staff      82 Jul 31 12:42 ./testfolder2/testfolder/._.DS_Store
-rw-r--r--  0 diegoreymendez staff    6148 Jul 31 12:42 ./testfolder2/testfolder/.DS_Store
-rw-r--r--  0 diegoreymendez staff  325377 Jul  5 09:50 ./testfolder2/testfolder/Scala.pages
Archive Format: POSIX ustar format,  Compression: none

손상된 .TAR 파일 :

> tar -tvvf corrupted.tar 
tar: Unrecognized archive format
Archive Format: (null),  Compression: none
tar: Error exit delayed from previous errors.

이것들은 모두 매우 하위 최적 솔루션입니다. 로부터 GZIP 사양

ID2 (식별 2)
이들은 파일을 gzip 형식 인 것으로 식별하기 위해 고정 값 id1 = 31 (0x1f, 037), id2 = 139 (0x8b, 213)가 있습니다.

사용중인 언어로 코딩해야합니다.

> -o 옵션을 사용하십시오. [...] TAR 파일이 손상되면 프로세스에 오류가 발생합니다.

때로는 그렇지만 때로는 그렇지 않습니다. 손상된 파일의 예를 보자.

echo Pete > my_name
tar -cf my_data.tar my_name 

# // Simulate a corruption
sed < my_data.tar 's/Pete/Fool/' > my_data_now.tar
# // "my_data_now.tar" is the corrupted file

tar -xvf my_data_now.tar -O

이것은 보여준다:

my_name
Fool  

실행하더라도

echo $?

타르는 오류가 없다고 말했다.

0

그러나 파일이 손상되었고, 이제는 "피트"대신 "바보"가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top