Unix bash脚本检查空gz文件

Unix bash脚本检查空gz文件

我正在尝试编写一个 bash 脚本,该脚本将进入 .gz 文件的目录循环,并在它们为空时删除它们(即空中包含的未压缩文件)。

我有几个问题:

  • 是否有我可以检查的压缩 (gz) 空文件的标准文件大小?
  • 或者是否有更好的方法来检查 gz 是否包含空文件,而无需使用 bash 脚本解压缩它?

我试图使用以下代码来实现此目的,但我认为它依赖于文件大小为 0。

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

答案1

不幸的是,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

可以做你想做的事吗?

答案2

您可以添加-ltogzip|gunzip|zcat打印有关 gzip 压缩文件的信息,然后测试未压缩文件的大小。

$ 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,以在删除文件之前要求确认,但如果您的情况不需要,您可以将其删除。

相关内容