나는 .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
-l
gzip 압축 파일에 대한 인쇄 정보 를 추가한 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
귀하의 경우에 필요하지 않은 경우 삭제할 수 있습니다.