我正在尝试编写一个 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
您可以添加-l
togzip|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
,以在删除文件之前要求确认,但如果您的情况不需要,您可以将其删除。