首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获取除尾随零字节外的文件大小

获取除尾随零字节外的文件大小
EN

Unix & Linux用户
提问于 2020-05-12 12:54:06
回答 1查看 411关注 0票数 3

我想得到正在下载的文件的大小。由于文件是预先分配的,所以使用du -sd只返回其最终的完整大小。我想知道已经下载了多少,所以我不希望那些尾随的零字节数。这个尺码是怎么弄到的?

这应该是可能的,因为aria2c可以轻松地恢复其已停止的下载,而且它似乎没有将下载的长度存储在它的控制(会话)文件中。我编写了一个脚本来从.aria2控制文件中读取total_length。这是总长度,而不是下载的长度。您可以很容易地使用该脚本和技术规格来获取任何其他属性aria2存储。

评论中的最新情况:

正如ilkkachu所暗示的,.aria2文件中的BITFIELD似乎实际上是一个映射:每个位对应于一个文件块,1表示“下载”(0表示“未下载”)。BITFIELD长度给出了块的数量(块大小很可能就是文件的大小除以块号)。我确信下载进度是由BITFIELD中的1s与块数的比率来实现的。不幸的是,AFAICT,.aria2文件似乎是经过一些延迟更新,或一旦下载被中断。

EN

回答 1

Unix & Linux用户

发布于 2020-05-13 10:00:38

考虑到了解aria2在下载上有多远的问题,有几种选择。

正如注释中所讨论的,信息在控制文件(filename.aria2)中的位图中。它被记录在https://aria2.github.io/manual/en/html/technical-notes.html中。拥有一个位图对HTTP下载没有多大意义,从一开始就线性地下载,但我认为对于BitTorrent下载或类似的下载更有意义。

下面是用于特定下载的控制文件的十六进制转储,其中标记了重要字段(od -tx1 file.aria2):

代码语言:javascript
复制
0000000 00 01 00 00 00 00 00 00 00 00 00 10 00 00 00 00
                                      ^^^^^^^^^^^ ^^^^^^  
0000020 00 00 82 9d c0 00 00 00 00 00 00 00 00 00 00 00 
        ^^^^^^^^^^^^^^^^^                         ^^^^^^
0000040 01 06 ff ff ff ff ff ff ff ff ff ff ff ff ff ff
        ^^^^^ ^^^... 
0000060 ff ff ff ff ff ff ff ff ff fe 00 00 00 00 00 00


offset 10: 00 10 00 00 => piece length = 0x100000 = 1 MiB
offset 14: 00 00 00 00 
           82 9d c0 00 => file length = 0x829dc000 = 2191376384 (~ 2 GiB)
offset 30: 00 00 01 06 => size of bitmap = 0x0106 = 262 bytes, could fit 2096 pieces
offset 34: ff ff ...   => bitmap

计算位图中的设置位,在下载至少191个1 MiB (200278016字节)后,该特定的下载被中断,这与我得到的文件大小( 201098200字节)基本吻合。(实际的文件比MiB大一点,控制文件中的飞行中片段的记录可能会标记这一点,但我并不在意。我没有预先分配,只是为了与文件系统上的大小交叉检查。)

默认情况下,aria2c每60秒保存一次控制文件,但我们可以使用--auto-save-interval=<secs>来更改该文件:

代码语言:javascript
复制
--auto-save-interval=<SEC>
       Save a control file(*.aria2) every SEC seconds.  If 0 is
       given, a control file is not saved during download. aria2
       saves  a  control  file  when  it stops regardless of the
       value.  The possible values are between 0 to 600. 
       Default: 60

或者,我认为您可以使用aria2c --log=<logfile>并将下载进度从日志中提取出来。虽然进度似乎只显示在DEBUG级别消息中的写缓存条目,但是在启用这些条目时,日志相当冗长。

另外,您可以使用--summary-interval=1将一些进度输出打印到stdout,可能会重定向到某个日志文件(也许还可以使用--show-console-readout=false隐藏实时读出)。虽然它似乎只给出了四舍五入的数字:

代码语言:javascript
复制
 *** Download Progress Summary as of Wed May 13 12:57:11 2020 ***
=================================================================
[#b56779 1.7GiB/2.0GiB(86%) CN:1 DL:105MiB ETA:2s]
FILE: /work/blah.iso
-----------------------------------------------------------------
票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/586147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档