我有一个目录,其中包含数千个.gz文件。现在我想找到最大的未压缩文件大小而不解压缩它。例如,dir1有1.gz,2.gz,3.gz等,我想找到最大的未压缩文件大小,而不解压缩它我尝试了以下命令,但它不起作用
find . -type f -name '*.gz' | xargs zcat | xargs ls -1s
我是Bash和Linux的新手。
fgw7neuy1#
有趣的是,根据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):大小是第二个参数。因此,您不需要解压缩文件在所有如果您的原始文件都小于4gb的大小:
gzip -l file(s)
find . -name '*.gz' -print | xargs gzip -l | awk '{ print $2, $4 ;}' | grep -v '(totals)$' | sort -n | tail -1
这将比我在这里看到的其他解决方案快得多^^
请注意:对于大小大于2^32的文件,结果将仅为“modulo 2^32”(例如,大小为“2^32 + 1”字节的文件将被报告为大小为1字节!)。因此,如果您的压缩文件最初大于4 GB,则需要解压缩(如果您愿意,可以在运行中解压缩)以获得其真实的大小!
编辑:我试着看看是否可以使用比率来代替“原始大小模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。所以比例应该是一样的。但似乎比例使用的是“未压缩”字段,而不是原始大小本身。
jhkqcmku2#
你的命令没有任何意义find . -type f -name '*.gz' | xargs zcat将(如果一切顺利)写出所有zip文件的内容,但是将这些文件的内容转换为命令行参数(就像xargs所做的那样)并将它们传递给ls -1s(它期望其参数是文件名)是没有意义的。我看不出有什么好办法挽救你的方法。我建议写一个循环:
find . -type f -name '*.gz' | xargs zcat
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"
eqzww0vc3#
您可以尝试:
find . -type f -name '*.gz' -printf '%s %p\n'|sort -nr|head -n 1
这将按文件大小的降序对 *.gz文件进行排序,然后打印该列表中的第一个文件。
fnx2tebb4#
如果你更喜欢oneliner(而不是ruakh的解决方案),你可以试试这个:
find . -type f -name '*.gz' -printf "%p " -exec sh -c 'zcat {} | wc -c ' \; | sort -k2 | tail -1
说明:
apeeds0o5#
与Olivier迪拉克几乎相同的解决方案,同时使用gzip -l:
gzip -l
find . -name '*.gz' | xargs gzip -l | tail -n +2 | head -n -1 | sort -k 2 | tail -n 1 | awk '{print $NF}'
5条答案
按热度按时间fgw7neuy1#
有趣的是,根据http://www.gzip.org/zlib/rfc-gzip.html
因此,格式包含原始大小(模2^32,“应该对任何人都足够了”,但当然不是。见下面的警告!).现在我们只需要一个命令来为我们输出它:
gzip -l file(s)
:大小是第二个参数。因此,您不需要解压缩文件在所有如果您的原始文件都小于4gb的大小:
这将比我在这里看到的其他解决方案快得多^^
请注意:对于大小大于2^32的文件,结果将仅为“modulo 2^32”(例如,大小为“2^32 + 1”字节的文件将被报告为大小为1字节!)。因此,如果您的压缩文件最初大于4 GB,则需要解压缩(如果您愿意,可以在运行中解压缩)以获得其真实的大小!
编辑:我试着看看是否可以使用比率来代替“原始大小模2^32”:不...
=>该比率对于>4GB的文件也不可用.(5gb/5210215 = 1030。1gb/1042074也= 1030。所以比例应该是一样的。但似乎比例使用的是“未压缩”字段,而不是原始大小本身。
jhkqcmku2#
你的命令没有任何意义
find . -type f -name '*.gz' | xargs zcat
将(如果一切顺利)写出所有zip文件的内容,但是将这些文件的内容转换为命令行参数(就像xargs
所做的那样)并将它们传递给ls -1s
(它期望其参数是文件名)是没有意义的。我看不出有什么好办法挽救你的方法。我建议写一个循环:
eqzww0vc3#
您可以尝试:
这将按文件大小的降序对 *.gz文件进行排序,然后打印该列表中的第一个文件。
fnx2tebb4#
如果你更喜欢oneliner(而不是ruakh的解决方案),你可以试试这个:
说明:
apeeds0o5#
与Olivier迪拉克几乎相同的解决方案,同时使用
gzip -l
: