Programing

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

crosscheck 2020. 8. 23. 08:22
반응형

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


데이터가 파일없이 유효한 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 (성공) 값. tar 또는 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*

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

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

I have tried the following command and they work well.

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

However, we can found these two command are time-consuming. Maybe we need some more quick way to determine the intact of the compress files.


A nice option is to use tar -tvvf <filePath> which adds a line that reports the kind of file.

Example in a valid .tar file:

> 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

Corrupted .tar file:

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

These are all very sub-optimal solutions. From the GZIP spec

ID2 (IDentification 2)
These have the fixed values ID1 = 31 (0x1f, \037), ID2 = 139 (0x8b, \213), to identify the file as being in gzip format.

Has to be coded into whatever language you're using.


> use the -O option. [...] If the tar file is corrupt, the process will abort with an error.

Sometimes yes, but sometimes not. Let's see an example of a corrupted file:

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

It shows:

my_name
Fool  

Even if you execute

echo $?

tar said that there was no error:

0

but the file was corrupted, it has now "Fool" instead of "Pete".

참고URL : https://stackoverflow.com/questions/2001709/how-to-check-if-a-unix-tar-gz-file-is-a-valid-file-without-uncompressing

반응형