您好我有一个目录,其中包含数千个.gz文件。现在我想找到最大的未压缩文件大小而不解压缩它。例如,dir1有1.gz,2.gz,3.gz等等,我想找到最大的未压缩文件大小而不解压缩它
我尝试了以下命令,但它无法正常工作
find . -type f -name '*.gz' | xargs zcat | xargs ls -1s
请指导。我是bash和linux的新手。提前谢谢。
答案 0 :(得分:5)
有趣的是,根据http://www.gzip.org/zlib/rfc-gzip.html
ISIZE (Input SIZE)
This contains the size of the original (uncompressed) input data modulo 2^32.
因此格式包含原始大小(模2 ^ 32,“对任何人都应该足够”,但当然不是......请参阅下面的警告!)...现在我们只需输出一个命令对我们来说:gzip -l file(s)
:大小是第二个参数。
因此,根本不需要解压文件 IF 您的原始文件大小都小于4gb:
find . -name '*.gz' -print | xargs gzip -l | awk '{ print $2, $4 ;}' | grep -v '(totals)$' | sort -n | tail -1
这比我在这里看到的其他解决方案要快得多^^
但请注意:对于大小超过2 ^ 32的文件,结果将只是“模2 ^ 32”(例如,大小为“2 ^ 32 +”的文件1“字节将被报告为大小为1字节!)。因此,如果你有原始大于4Gb的压缩文件,你需要解压缩(如果你想要的话)以获得真正的大小!
编辑:我试图看看是否可以使用该比率而不是“原始尺寸模2 ^ 32”:不...
$ dd if=/dev/zero of=1_gb bs=1048576 count=1024 #creating a 1 Gb file
$ dd if=/dev/zero of=5_gb bs=1048576 count=5120 #creating a 5 Gb file
$ ls -al *gb*
-rw-r--r-- 1 user UsersGrp 1042074 Mar 4 10:30 1_gb.gz
-rw-r--r-- 1 user UsersGrp 5210215 Mar 4 10:28 5_gb.gz
$ gzip -l *gb*
compressed uncompressed ratio uncompressed_name
1042074 1073741824 99.9% 1_gb
5210215 1073741824 99.5% 5_gb
6252289 2147483648 99.7% (totals)
(notice the 2nd: the uncompressed is not 5gb, but 1gb, as it's modulo 2^32 (=4gb) :( )
=>对于文件> 4gb ...(5gb / 5210215 = 1030.1gb / 1042074 = 1030),该比率也是不可用的。因此比率应该相同。但似乎比率是使用“未压缩”字段,而不是原始尺寸本身。)
答案 1 :(得分:2)
你的命令真的没有意义; find . -type f -name '*.gz' | xargs zcat
将(如果一切顺利)写出所有zip文件的内容,但将这些文件的内容转换为命令行参数没有意义(如xargs
那样)并将它们传递给ls -1s
(期望其参数为文件名)。
我没有看到挽救你的方法的好方法。相反,我建议写一个循环:
max_size=0
for file in *.gz ; do
size="$(zcat "$file" | wc -c)"
if (( size > max_size )) ; then
max_size="$size"
largest_file="$file"
fi
done
echo "$largest_file"
答案 2 :(得分:1)
您可以尝试:
find . -type f -name '*.gz' -printf '%s %p\n'|sort -nr|head -n 1
这将按文件大小的降序对* .gz文件进行排序,然后在该列表中打印第一个文件。
答案 3 :(得分:0)
如果你更喜欢oneliner(超过ruakh的解决方案),你可以试试这个:
find . -type f -name '*.gz' -printf "%p " -exec sh -c 'zcat {} | wc -c ' \; | sort -k2 | tail -1
说明:
答案 4 :(得分:0)
使用gzip -l
找到与Olivier Dulac几乎相同的解决方案:
find . -name '*.gz' | xargs gzip -l | tail -n +2 | head -n -1 | sort -k 2 | tail -n 1 | awk '{print $NF}'