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


답변:


121

파일의 압축을 풀지 않고 타르볼 목록을 얻고 출력을 버리는 것은 어떻습니까?

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

댓글에 따라 수정되었습니다. 감사합니다 zrajm!

댓글에 따라 수정합니다. 감사합니다 Frozen Flame! 이 테스트는 데이터의 무결성을 의미하지 않습니다. 테이프 보관 유틸리티로 설계 되었기 때문에 대부분의 tar 구현에서는 동일한 파일의 여러 복사본을 허용합니다!


13
-v출력을 배관하는 경우 왜 사용 /dev/null합니까?
zrajm dec

2
참 @zrajm. 내 근육 기억이 시작되는 것 같아요! (-:
Rob Wells

5
-z옵션도 필요하지 않습니다. 추출 또는 목록 모드에서는 아무 작업도 수행하지 않습니다.
asmeurer 2014 년

1
@asmeurer Re : -z확실히 GNU tar의 경우입니다 . 이것이 다른 곳 (BSD 등)에서도 사실인지 아십니까?
belacqua 2014 년

2
@bobwells 그러나 성공적인 압축 해제 또는 콘텐츠 파일 나열은 데이터 무결성을 의미 tar.gz합니까? 지원 정보가 있습니까?
Frozen Flame

99

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 (성공) 값. tar 또는 gzip에 문제가있는 경우 $? 0이 아닌 값을 갖습니다.


3
그리고 bzip2 -t file.bz2bz2 파일의 경우.
asmeurer 2014 년

4
"tar -tzf my_tar.tar.gz> / dev / null"이 수행하는 작업을 수행하기 위해 두 개의 명령을 사용하지 않습니까?
Rob Wells

그것이 있어야되지 않는다 tar -t > /dev/null(참고 : t-t)?
Intrastellar Explorer

1
@IntrastellarExplorer는 내 부분의 오타이지만 하이픈 없이도 여전히 작동합니다. 저는 tar의 이전 스타일 옵션에 익숙합니다. unix.stackexchange.com/questions/394060/…
John Boker

32

디스크에 추출하지 않고 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*

1
가장 좋은 테스트는 이것 인 것 같습니다. 진정으로 각 파일을 추출하고 오류가 없는지 확인합니다.
슬리브

정말 유용합니다. 셸 스크립트를 만들고 파일 경로를 전달하는 인수 후크를 추가하고 내 경로에 넣습니다. :) [tar -xvzf $ 1 -O> / dev / null]
smonff

@sleeves 왜 그것이 받아 들여진 대답보다 낫다고 생각합니까? tar -tvzf hello.tgz> / dev / null도 동일한 오류를 제공합니다.
dash17291

5
@ dash17291 나는 모든 경우에 대해 -tvf가 -xvf의 모든 오류 또는 손상을 포착한다는 것을 증명하는 것이 어려운 문제가 될 것으로 기대하기 때문에 이것을 말합니다. 즉, -xvf는 -tvf를 모두 잡아 내지 만 그 반대가 사실이라고 말할 수는 없습니다.
소매는

> /dev/null작업 예제에도 사용해야 할 것 입니다.
moi

12

pigz(병렬 gzip)을 사용하여 * .tag.gz 파일의 내용을 확인하여 아카이브 검사 속도를 높일 수도 있습니다 .

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

미니 벤치 마크 : pigz -cvd : 80s로 실행하고 22G 아카이브에서 허용 된 답변 tar -tzv : 143s로 실행합니다.
Wadih M.

이 방법을 사용할 때 "tar : 멤버 이름에서 선행`/ '제거"에 대한 cronjob에서 알림을 어떻게 제거합니까?
MaXi32

3

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

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

그러나이 두 명령은 시간이 많이 걸립니다. 압축 파일이 손상되지 않았는지 확인하는 더 빠른 방법이 필요할 수 있습니다.


2

좋은 옵션은 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.

이것은 BSD tar에서 발생하지만 GNU tar에서는 발생하지 않습니다.
mcallister 2014 년

1

이들은 모두 매우 차선책입니다. 로부터 GZIP 사양

ID2 (IDentification 2)
파일을 gzip 형식으로 식별하기 위해 고정 값 ID1 = 31 (0x1f, \ 037), ID2 = 139 (0x8b, \ 213)가 있습니다.

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


파일이 잘린 경우 감지하려면 전체 압축 해제가 필요한 것 같습니다
philwalk

0

> -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 $?

tar는 오류가 없다고 말했습니다.

0

그러나 파일이 손상되었으므로 이제 "Pete"대신 "Fool"이 있습니다.


사람들은 압축없이 tar 파일을 거의 사용하지 않습니다. 귀하의 발언은 압축되지 않은 파일에만 관련된 것 같습니다.
Jarekczek

6
무결성과 부패를 혼동하고 있습니다. 파일이 무결성을 잃었지만 여전히 허용되는 아카이브 형식입니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.