빈 gz 파일을 확인하는 Unix bash 스크립트

빈 gz 파일을 확인하는 Unix bash 스크립트

나는 .gz 파일의 디렉터리를 반복하면서 파일이 비어 있으면 삭제하는 bash 스크립트를 작성하려고 합니다(예: 공기 중에 포함된 압축되지 않은 파일).

몇 가지 질문이 있습니다.

  • 확인할 수 있는 압축(gz) 빈 파일의 표준 파일 크기가 있습니까?
  • 아니면 bash 스크립트를 사용하여 압축을 풀지 않고 gz에 빈 파일이 포함되어 있는지 확인하는 더 좋은 방법이 있습니까?

이를 달성하기 위해 다음 코드를 사용하려고 하는데 파일 크기가 0이어야 한다고 생각합니다.

for f in dir/*
do
    if [[ -s $f ]]
    then
        do_file_creation
    fi
done

답변1

불행하게도 gzip에는 원래 파일 이름이 포함되어 있으므로 빈 파일에 따라 크기가 달라집니다.

gunzip -c $f | head -c1 | wc -c

압축되지 않은 크기가 0이 아닌 파일의 경우 1을 표시하고, 압축된 빈 파일의 경우 0을 표시합니다.

for f in dir/*
do
    if [[ $(gunzip -c $f | head -c1 | wc -c) == "0" ]] 
    then
        do_file_creation
    fi
done

당신이 원하는 것을 할 수 있습니까?

답변2

-lgzip 압축 파일에 대한 인쇄 정보 를 추가한 gzip|gunzip|zcat다음 압축되지 않은 파일의 크기를 테스트할 수 있습니다 .

$ gunzip -l file.empty.gz 
compressed        uncompressed  ratio uncompressed_name
        31                   0   0.0% file.empty

답변3

파일 이름(또는 압축 파일에 이름이 없으면)으로 인해 파일 크기가 변경되므로 표준 크기를 찾을 수 없습니다.

$ touch file1 file2-longer-name file3
$ gzip file1 file2-longer-name
$ gzip --no-name file3
$ ls -l file*.gz
-rw-r--r-- 1 cwarden cwarden 26 May 29 10:33 file1.gz
-rw-r--r-- 1 cwarden cwarden 38 May 29 10:33 file2-longer-name.gz
-rw-r--r-- 1 cwarden cwarden 20 May 29 10:33 file3.gz

나는 다음과 같이 할 수 있습니다 :

for f in dir/*; do
    zcat $f | head -1 | ifne -n rm -f $f > /dev/null
done

답변4

for i in *.gz
do
     [ `zcat "$i" | head -n 1 | wc -c ` -eq 0 ] && rm -i "$i"
done

파일의 첫 번째 줄에 있는 문자 수가 계산 되므로 zcat "$i" | head -n 1 | wc -c파일의 시작 부분만 보고 전체 파일의 압축이 풀리는 것을 방지할 수 있습니다.

-i파일을 삭제하기 전에 확인을 요청하는 명령 에 하나를 추가했는데 , rm귀하의 경우에 필요하지 않은 경우 삭제할 수 있습니다.

관련 정보