我想检查zip中的文件是否为空。我知道unzip -l
命令,但它提供了很多信息。
[abc@localhost test]$ unzip -l empty_file_test.zip
Archive: empty_file_test.zip
Length Date Time Name
--------- ---------- ----- ----
0 07-05-2017 06:43 empty_first_20170505.csv
0 07-05-2017 06:43 empty_second_20170505.csv
--------- -------
0 2 files
我通过命令从zip文件中提取了文件名
file_names="$(unzip -Z1 empty_file_test.zip)
file_name_array=($file_names)
file1=${file_name_array[0]}
file2=${file_name_array[1]}
我尝试使用-s
选项但没有用
if [ -s $file1 ]; then
echo "file is non zero"
else
echo "file is empty"
fi
即使文件不为空,它始终打印file is empty
。
unzip -l empty_file_test.zip | awk 'NR>=4{if($1==0){print $4}}'
可能对你有用,也可以写成
unzip -l empty_file_test.zip | awk 'NR >= 4 && $1==0{print $4}'
您可以格式化解压缩 -l 的输出
unzip -l test.zip | awk '{print $1 "t" $4}' | tail -n+4 | head -n-2
解释:
unzip -l
解压缩文件并返回已解压缩的信息
awk '{print $1 "t" $4}'
打印第 1 列和第 4 列(大小和文件名)
tail -n+4
从输出中删除前几行(删除标头和不需要的信息)
head -n-2
从输出中删除最后两行(删除不需要的摘要)
编辑:
要将空文件存储到数组中,您可以映射 comand 的输出:
read -r -a array <<< `unzip -l test.zip | awk '{print $1 "t" $4}' | tail -n+4 | head -n-2 | awk '{if($1==0) print $2}'`
解释
unzip -l test.zip | awk '{print $1 "t" $4}' | tail -n+4 | head -n-2
上面解释过
awk '{if($1==0)}{print $2}'
只给你空文件的文件名
<<<
将反引号''中的命令输出输入到read命令中
read -r -a array
将输入读入变量数组
但
您可以使用 Sjsam 的较短命令并执行相同的操作:
read -r -a array <<< `unzip -l empty_file_test.zip | awk 'NR>=4{if($1==0){print $4}}'`
read -r -a array
上面解释过
<<<
上面解释过
awk 'NR>=4{if($1==0){print $4}}'
NR>=4
> 4 中输出每一行(剥离标头和不需要的输出)if($1==0){print $4}}
如果大小($0)为0,则执行{print $4}
{print $4}
输出文件名