Unix bash скрипт проверяет пустые файлы gz

Я пытаюсь написать сценарий bash, который войдет в цикл каталога через .gz-файлы и удалит их, если они пусты (т. Е. Несжатый файл, содержащийся в пустом.

У меня есть несколько вопросов:

  • Есть ли стандартный размер файла сжатого (gz) пустого файла, который я могу проверить?
  • Или есть лучший способ проверить, содержит ли gz пустой файл без распаковки его с помощью сценария bash?

Я пытался использовать следующий код, чтобы добиться этого, но полагается на размер файла 0.

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

К сожалению, gzip содержит оригинальное имя файла, поэтому его размер будет отличаться без разных пустых файлов.

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

будет эхо 1 для файлов, которые не равны нулю в несжатом размере, и 0 для сжатых пустых файлов.

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

Можете сделать то, что хотите?

Вы можете добавить -l в gzip|gunzip|zcat чтобы распечатать информацию о файле gzipped, а затем протестировать файл без сжатия.

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

Имя файла (или отсутствие имени файла в сжатом файле) изменит размер файлов, чтобы вы не могли найти стандартный размер, например

 $ 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 

Вероятно, есть лучший способ, но это должно дать вам размер файла несжатой версии сжатого файла:

export fsize=$(gunzip -l ${f} | tail -1 | awk -F " " '{print $2}' )

 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 zcat "$i" | head -n 1 | wc -c zcat "$i" | head -n 1 | wc -c будет подсчитывать количество символов в первой строке файла, это позволяет избежать разжатия всего файла, просто глядя на его начало.

Я также добавил -i в команду rm чтобы запросить подтверждение перед удалением файла, но вы можете удалить его, если это не обязательно в вашем случае.