Получить размер файла, за исключением завершающих нулевых байтов.

strings puttyoutout.txt |grep searchterm
3
13.05.2020, 10:38
2 ответа

Я написал ржавый скрипт, который подсчитывает конечные нули. Это довольно быстро, но загружает весь файл. См. этот вопрос .

Для запуска этого скрипта в вашей системе должны быть установлены rustи scriptisto. Я назвал этот скрипт trailingzeroes.rsв своей системе.

#!/usr/bin/env scriptisto

// scriptisto-begin
// script_src: src/main.rs
// build_cmd: cargo build --release
// target_bin:./target/release/script
// files:
//  - path: Cargo.toml
//    content: |
//     package = { name = "script", version = "0.1.0", edition = "2018"}
//     [dependencies]
// scriptisto-end

// https://users.rust-lang.org/t/count-trailing-zero-bytes-of-a-binary-file/42503/4

use std::env;
use std::fs;

fn main() {
    let filename = env::args().nth(1).unwrap();
    let buffer = fs::read(filename).unwrap();
    let count = buffer.iter().rev().take_while(|b| **b == 0).count();
    println!("{}", count);
}

Сейчас,

# gdu is GNU du
# ggrep is GNU grep

function filesize() {
    # '<file> ; returns size in bytes.'

    local FILENAME="$1"
    test -e "$FILENAME" || { echo "File $FILENAME doesn't exist." >&2 ; return 1 }

    local SIZE="$(gdu -sb $FILENAME | awk '{ print $1 }')"
    ec $SIZE
}
function filesizereal() {
    local file="$1"
    test -e "$file" || { echo "File $file doesn't exist." >&2 ; return 1 }
    local zerobytes
    # zerobytes=$(( $( ggrep -aPo '\0*$' $file | wc -c ) - 1 ))
    zerobytes="${$(trailingzeroes.rs $file)}"
    echo $(( ${$(filesize $file):-0} - $zerobytes )) 
}
0
28.04.2021, 23:14

Принимая во внимание только вопрос о том, как долго aria2находится в загрузке, есть несколько вариантов.

Как обсуждалось в комментариях, информация находится в растровом изображении в управляющем файле (filename.aria2). Это задокументировано в https://aria2.github.io/manual/en/html/technical-notes.html. Наличие растрового изображения не имеет особого смысла для HTTP-загрузки, которая с самого начала идет линейно, но я полагаю, что это было бы более целесообразно для загрузки BitTorrent или чего-то подобного.

Вот шестнадцатеричный дамп управляющего файла для конкретной загрузки с отмеченными важными полями(od -tx1 file.aria2):

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 МБ (200278016 байт ), что в значительной степени соответствует полученному размеру файла, 201098200 байт. (Фактический файл был больше чуть меньше МиБ, записи для -полетных частей в контрольном файле могли это отметить, но мне было все равно. У меня не было предварительного -распределения, просто чтобы я мог перепроверить размер в файловой системе.)

По умолчанию aria2cсохраняет контрольный файл каждые 60 секунд, но мы можем использовать --auto-save-interval=<secs>, чтобы изменить это:

--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, чтобы скрыть считывание в реальном времени ). Хотя кажется, что он дает только округленные цифры :

.
 *** 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
28.04.2021, 23:14

Теги

Похожие вопросы