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 -cwyodrębnić pierwszego bajtu, użyj head -n 1zamiast niego , aby wyodrębnić pierwszy wiersz.)
LC_ALL=Cnie może zranić.
readjest wywoływana w podpowłoce (i $linenie jest propagowana do elementu nadrzędnego).
trnaprawia.
Jeśli przez „pusty” rozumiesz, że nieskompresowany plik ma 0 bajtów, możesz użyć go gzip --list foo.gzdo 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=Cczy istnieje pewność, że gzip nie wstawi tysięcy separatorów w liczbach, aby pole można było porównać do zera?