Odpowiedzi:
gzip -l foo.gz | awk 'NR==2 {print $2}'
wypisuje rozmiar nieskompresowanych danych.
if LC_ALL=C gzip -l foo.gz | awk 'NR==2 {exit($2!=0)}'; then
echo foo is empty
else
echo foo is not empty
fi
Alternatywnie możesz rozpocząć rozpakowywanie danych.
if [ -n "$(gunzip <foo.gz | head -c 1 | tr '\0\n' __)" ]; then
echo "foo is not empty"
else
echo "foo is empty"
fi
(Jeśli twój system nie musi head -c
wyodrębnić pierwszego bajtu, użyj head -n 1
zamiast niego , aby wyodrębnić pierwszy wiersz.)
LC_ALL=C
nie może zranić.
read
jest wywoływana w podpowłoce (i $line
nie jest propagowana do elementu nadrzędnego).
tr
naprawia.
Jeśli przez „pusty” rozumiesz, że nieskompresowany plik ma 0 bajtów, możesz użyć go gzip --list foo.gz
do określenia rozmiaru nieskompresowanego pliku, jego zautomatyzowanie wymagałoby parsowania. Wygląda to mniej więcej tak:
$ gzip --list foo.gz
compressed uncompressed ratio uncompressed_name
24 0 0.0% foo
Należy pamiętać, że format pliku gzip pozwala tylko na 32 bity do przechowywania oryginalnego rozmiaru pliku, więc liczba jest wielkości modulo 2 ^ 32. Dlatego rozmiar podany przez „gzip -l” nie jest ostatecznym testem na pustkę.
LC_ALL=C
czy istnieje pewność, że gzip nie wstawi tysięcy separatorów w liczbach, aby pole można było porównać do zera?