Использование pv с md5sum

Да, можно. Перейдите на страницу настроек и щелкните расширенные настройки. В разделе «Веб-контент» нажмите кнопку шрифтов. Затем в нижней части диалогового окна перейдите к дополнительным параметрам шрифта. Это приведет вас к подключаемому модулю Chrome для расширенных шрифтов / скриптов шрифтов вот ссылка, если ссылки нет в шрифтах раздел https://chrome.google.com/webstore/detail/advanced-font-settings/caclkomlalccbpcdllchkeecicepbmbm

изменить

https://chrome.google.com/webstore/detail / styler / bogdgcfoocbajfkjjolkmcdcnnellpkb

это расширение должно работать, извините, я думал, что это позволяет настраиваемые сценарии.

7
19.01.2019, 18:29
5 ответов

Утилита pvпредставляет собой "причудливую cat", что означает, что вы можете использовать pvв большинстве ситуаций, где вы использовали бы cat.

Используя catс md5sum, вы можете вычислить контрольную сумму MD5 для одного файла с помощью

cat file | md5sum

или с pv,

pv file | md5sum

К сожалению, это не позволяет md5sumправильно вставлять имя файла в вывод.

Теперь, к счастью, pvявляется действительно причудливым cat, и в некоторых системах (Linux )он может наблюдать за передаваемыми данными. через другой процесс. Это делается с помощью его опции -dс идентификатором процесса этого другого процесса.

Это означает, что вы можете делать такие вещи, как

md5sum dir/* | sort >sums &
sleep 1
pv -d "$(pgrep -n md5sum)"

Это позволит pvнаблюдать за процессом md5sum. sleepпредназначен для правильного запуска md5sum, работающего в фоновом режиме. pgrep -n md5sumвернет PID самого последнего запущенного md5sumпроцесса, которым вы владеете. pvзавершится, как только процесс, за которым он наблюдает, завершится.

Я протестировал этот конкретный способ запуска pvнесколько раз, и в целом он работает хорошо, но иногда кажется, что он перестает что-либо выводить, когда md5sumпереключается на следующий файл. Иногда кажется, что в оболочке появляются ложные фоновые задачи.

Вероятно, было бы безопаснее запускать его как

md5sum dir/* >sums &
sleep 1
pv -W -d "$!"
sort -o sums sums

Параметр -Wзаставит pvждать, пока фактически не будут переданы данные, хотя это также не всегда работает надежно.

11
27.01.2020, 20:13

Данные, которые вы передаете через конвейер, не являются данными файлов, которые md5sumобрабатывают, а представляют собой выходные данные md5sum, которые для каждого файла состоят из одной строки, содержащей :MD5. -хэш, два пробела и имя файла. Поскольку мы знаем это заранее, мы можем сообщить pvсоответствующим образом, чтобы он мог отображать точный индикатор прогресса. Есть два способа сделать это.

Первый, предпочтительный метод (, предложенный frostschutz ), использует тот факт, что md5sumгенерирует одну строку для каждого обрабатываемого файла, и тот факт, что pvимеет построчный режим, в котором подсчитываются строки, а не байты.. В этом режиме pvбудет перемещать индикатор выполнения только тогда, когда он встречает новую строку в пропускной способности, то есть для каждого файла, завершенного md5sum. В Bash этот первый метод может выглядеть так:

set -- *.iso; md5sum "$@" | pv --line-mode -s $# | sort

Встроенная функция setиспользуется для установки позиционных параметров для обрабатываемых файлов. (шаблон оболочки *.isoрасширяется оболочкой ). Затем md5sumсообщается об обработке этих файлов($@расширяется до позиционных параметров ), а pvв линейном режиме будет перемещать индикатор выполнения каждый раз, когда файл обрабатывается / выводится строка md5sum. Примечательно, что pvсообщается об общем количестве ожидаемых строк (-s $#), так как специальный параметр оболочки $#расширяется до количества позиционных аргументов.

Второй метод основан не на строке -, а на байте -. С md5sumэто излишне сложно, но какая-то другая программа может производить не строки, а, например, непрерывные данные, и тогда этот подход может оказаться более практичным. Однако я иллюстрирую это md5sum. Идея состоит в том, чтобы рассчитать количество данных, которыеmd5sum(или какая-либо другая программа )создаст, и использовать их для информирования pv. В Баше,это может выглядеть следующим образом:

os=$(( $( ls -1 | wc -c ) + $( ls -1 | wc -l ) * 34 ))
md5sum * | pv -s $os | sort

В первой строке вычисляется выходной размер(os)оценка :первое слагаемое — количество байтов, необходимых для кодирования имен файлов (в т.ч. новая строка ), второй термин количество байтов, используемых для кодирования хэшей MD5 -(по 32 байта )плюс 2 пробела. Во второй строке мы сообщаем pv, что ожидаемый объем данных составляет osбайт, чтобы он мог показывать точный индикатор прогресса, ведущий к 100% (, какой индикатор обновляется для каждого готового файла md5summed ).

Очевидно, что оба метода практичны только в том случае, если необходимо обработать несколько файлов. Кроме того, следует отметить, что, поскольку вывод md5sumне связан с количеством времени, которое программа md5sumдолжна потратить на обработку базовых данных, индикатор выполнения можно считать несколько вводящим в заблуждение. Например, во втором методе файл с самым коротким именем будет давать наименьшее обновление прогресса, даже если на самом деле он может быть самым большим по размеру. Опять же, если все файлы имеют одинаковые размеры и имена, это не должно иметь большого значения.

5
27.01.2020, 20:13

Как уже отмечалось в комментариях и других ответах:

  1. Вы передаете в pvтолько md5sumвывод :контрольных сумм и имен файлов; таким образом, индикатор выполнения pvне может показать, сколько данных считывается md5sum.
  2. Размер в 4 ГБ для этого будет, конечно, многовато. Кроме того, предоставлять pvразмер файла (с ), который вы передаете в него (вручную, с-s)неудобно.

Перенос содержимого ваших файлов в pv, а затем в md5sumдаст вам индикатор выполнения, но имена файлов будут потеряны.

Этот код — не очень элегантный способ иметь и то, и другое — осмысленный индикатор выполнения и имена файлов с контрольными суммами:

#!/bin/sh

for file in "$@"; do
    pv -- "$file" |
    md5sum |
    sed 's/-$//' |
    printf '%s%s\n' "$(cat -)" "$file"
done

Скрипт предназначен для вызова как:

./script dir/*

Конечно, вы можете объявить его как функцию, чтобы не вводить путь к нему для вызова (или добавлять его в свойPATH):

function pvsum () {
    for file in "$@"; do
        pv -- "$file" |
          md5sum |
          sed 's/-$//' |
          printf '%s%s\n' "$(cat -)" "$file"
    done
}

Таким образом, команда pvsum dir/* | sortбудет эквивалентна вашей md5sum dir/* | pv -s <size> | sort.

Его вывод:

$./testscript testdir/*
4.00GiB 0:00:09 [ 446MiB/s] [==============================>] 100%            
9dab5f8add1f699bca108f99e5fa5342  testdir/file1
1.00GiB 0:00:02 [ 447MiB/s] [==============================>] 100%            
06a738a71e3fd3119922bdac259fe29a  testdir/file2

Что он делает:

  • Он перебирает заданные файлы и для каждого :
    • Передает файл из pvв md5sumс отображением индикатора выполнения по умолчанию.
    • sedиспользуется для удаления -, напечатанного md5sum(, который считывается со стандартного ввода ); это также попытка сделать вывод пригодным для потребленияmd5sum -c(благодаря frostschutz за указание на это)1 .
    • На стандартный вывод выводится контрольная сумма, за которой следует имя файла.

Оsort:

Я не уверен в ваших ожидаемых результатах, поэтому просто проигнорировал их.Поскольку pvзаписывает свой индикатор выполнения в стандартную ошибку, передача всего в sortотсоединит вывод pvот вывода md5sum.
В любом случае, вы можете просто добавить | sortпосле doneв приведенном выше коде и проверить, устраивает ли вас результат.


1 Обратите внимание, что вывод кода, показанного выше, не подходит для md5sum -c, если имена файлов содержат символы новой строки. Обработка новых строк возможна, но некоторые версии md5sumведут себя по-разному в этом отношении (см., например, ответы на этот вопрос ), что делает общее решение непростым (и выходит за рамки этого ответа ).

Предполагая последнюю версию md5sum, попытка решить эту проблему может быть:

for file in "$@"; do
    pv -- "$file" |
    md5sum |
    sed 's/-$//' |
    printf '%s%s\n' "$(cat -)" "$file" |
    sed -n 'H; 1h; $!d; g; s/\\/\\\\/g; s/\n/\\n/g; t x; p; q; :x s/^/\\/; p;'
done

Там, где единственное дополнение, окончательное sed, будет:

  • Поместить весь ввод, контрольную сумму и имя текущего файла в пространство шаблонов, так как он может содержать символы новой строки:HДобавляет новую строку и текущее пространство шаблонов в пространство хранения; 1hпереопределяет предыдущий Hтолько для первой строки, делая то же самое, но без добавления новой строки; $!dзапускает новый цикл, если текущая строка не последняя; gпомещает содержимое пространства хранения в пространство шаблонов.
  • Экранирование с помощью обратной косой черты(\)любой обратной косой черты в результирующем пространстве шаблона.
  • Замените на \nлюбую новую строку в результирующем пространстве шаблона.
  • Только если по крайней мере обратная косая черта или новая строка были заменены(t x:ветвь на метку x), обратная косая черта добавляется в начале контрольной суммы, чтобы сигнализировать md5sum -c, что что-то должно быть неэкранировано; в противном случае просто выйти. В обоих случаях распечатайте(p)пространство шаблонов в стандартный вывод непосредственно перед выходом из (опция -nотключает автоматическую -печать ).
1
27.01.2020, 20:13

Вот грязный хак для получения прогресса по файлам:

for f in iso/*
do
    pv "$f" | (
        cat > /dev/null &
        md5sum "$f"
        wait
    )
done

Как это выглядит:

4.15GiB 0:00:32 [ 130MiB/s] [================================>] 100%            
0db0b36fc7bad7b50835f68c369e854c  iso/KNOPPIX_V7.6.1DVD-2016-01-16-EN.iso
 792MiB 0:00:06 [ 130MiB/s] [================================>] 100%            
97537db63e61d20a5cb71d29145b2937  iso/archlinux-2016.10.01-dual.iso
 843MiB 0:00:06 [ 129MiB/s] [================================>] 100%            
1b5dc31e038499b8409f7d4d720e3eba  iso/lubuntu-16.04-desktop-i386.iso
 259MiB 0:00:02 [ 130MiB/s] [=========>                        ] 30% ETA 0:00:04
...

Здесь делается несколько предположений. Во-первых, чтение данных происходит медленнее, чем их хеширование. Во-вторых, эта ОС будет кэшировать ввод-вывод, поэтому данные не будут (физически )считываться дважды, даже если pvи md5sumявляются полностью независимыми устройствами чтения.

Преимущество такого грязного, грязного хака заключается в том, что вы можете легко адаптировать его для создания индикатора выполнения для всех данных, а не только для одного файла. И все еще делать странные вещи, такие как сортировка вывода после этого.

pv iso/* | (
    cat > /dev/null &
    md5sum iso/* | sort
    wait
)

Как это выглядит (в процессе):

15.0GiB 0:01:47 [ 131MiB/s] [===========================>      ] 83% ETA 0:00:21

Как это выглядит (готово):

18.0GiB 0:02:11 [ 140MiB/s] [================================>] 100%            
0db0b36fc7bad7b50835f68c369e854c  iso/KNOPPIX_V7.6.1DVD-2016-01-16-EN.iso
155603390e65f2a8341328be3cb63875  iso/systemrescuecd-x86-4.2.0.iso
1b5dc31e038499b8409f7d4d720e3eba  iso/lubuntu-16.04-desktop-i386.iso
1b6ed6ff8d399f53adadfafb20fb0d71  iso/systemrescuecd-x86-4.4.1.iso
25715326d7096c50f7ea126ac20eabfd  iso/openSUSE-13.2-KDE-Live-i686.iso
...

Ну, это для хаков. Проверьте другие ответы для правильных решений. ;-)

2
27.01.2020, 20:13

Мне также понравилось приручать «причудливую кошку», pv, дляmd5sum:-)

  • Я думаю, что мой шеллскрипт теперь довольно стабилен
  • Существует вывод usage, если вы неправильно ввели шаблон.
  • Работает с подстановочными знаками, но не рекурсивно переходит в подкаталоги
  • Вы можете ввести более одного шаблона, например".* *"
  • Имеется переключатель подробностей, который включает проверку md5sums... OK
  • Вы можете перенаправить соответствующий вывод в файл; вывод представления процесса pvостанется на {окне экрана/терминала}
  • В цикле for есть два pvпроцесса, один глобальный и по одному для каждого файла, глобальный pv«подсчитывает только файлы»,а другой измеряет скорость и количество передаваемых данных
  • Управляющие последовательности ANSI используются для удержания представления процесса в стабильном положении.

Я использую имя md5summer, делаю шеллскрипт исполняемым и помещаю его в каталог в PATH (мой каталог ~/bin, вы можете предпочесть/usr/local/bin).

#!/bin/bash

# date      sign     comment
# 20190119  sudodus  created md5summer version 1.0

if [ "$1" == "-v" ]
then
 verbose=true
 shift
else
 verbose=false
fi
if [ $# -ne 1 ]
then
 echo "Usage:    $0  [-v]  <pattern>"
 echo "Example:  $0  '*.iso'      # notice the quotes"
 echo "          $0  -v  '*.iso'  # verbose"
 exit
fi
tmpstr=$(find $1 -maxdepth 0 -type f 2> /dev/null)
if [ "$tmpstr" == "" ]
then
 echo "No such file '$1'. Try another pattern!"
 exit
fi

tmpdir=$(mktemp -d)
tmpfil="$tmpdir/fil1"
tmpfi2="$tmpdir/fil2"
resetvid="\0033[0m"
prev2line="\0033[2F"
next2line="\0033[2E"

sln=1
cln=0
cnt=0
for i in $1
do
 if test -f "$i"
 then
  cln=$((cln+1))
  tmp=$(find -L "$i" -printf "%s")
  cnt=$((cnt+tmp))
 fi
done
echo "
                    number of files = $cln
                    total file size = $cnt B ~ $(($cnt/2**20)) MiB
"
for i in $1
do
 if test -f "$i"
 then
  tmpnam=$(echo -n "$i")
  tmpsum=$(< "$i" pv -ptrbs "$cnt" | md5sum)
  sleep 0.05
  echo "$sln" | pv -ls "$cln" > /dev/null
  sleep 0.05
  sln="$sln
$i"
  sleep 0.05
  printf "${tmpsum/\-}${tmpnam}\n" >> "$tmpfil"
  echo -ne "$prev2line" > /dev/stderr
 fi
done

sync
sleep 0.1
echo -ne "$next2line" > /dev/stderr

echo "-----"
if $verbose
then
 sort -k2 "$tmpfil" | tee "$tmpfi2" | md5sum -c
 echo "-----"
 cat "$tmpfi2"
else
 sort -k2 "$tmpfil"
fi
sleep 0.5
sync
rm -r "$tmpdir"

Демонстрационный пример

Использование

$ md5summer 
Usage:    /home/sudodus/bin/md5summer  [-v]  <pattern>
Example:  /home/sudodus/bin/md5summer  '*.iso'      # notice the quotes
          /home/sudodus/bin/md5summer  -v  '*.iso'  # verbose

Я тестировал в этом каталоге

$ ls -1a
.
..
'filename with spaces'
md5summer
md5summer1
md5summer2
subdir
.ttt
zenity-info-message.png

Обычное использование плюс шаблон для просмотра скрытых файлов

$ md5summer ".* *"

                    number of files = 6
                    total file size = 12649 B ~ 0 MiB

8,32KiB 0:00:00 [ 156MiB/s] [=============================>                ] 67%
6,00  0:00:00 [ 133k/s] [====================================>] 100%            
-----
184d0995cc8b6d8070f89f15caee35ce  filename with spaces
28227139997996c7838f07cd4c630ffc  md5summer
3383b86a0753e486215280f0baf94399  md5summer1
28227139997996c7838f07cd4c630ffc  md5summer2
31cd03f64a466e680e9c22fef4bcf14b .ttt
670b8db45e57723b5f1b8a63399cdfa1  zenity-info-message.png

Подробный вывод плюс шаблон для просмотра скрытых файлов

$ md5summer -v ".* *"

                    number of files = 6
                    total file size = 12649 B ~ 0 MiB

8,32KiB 0:00:00 [ 184MiB/s] [=============================>                ] 67%
6,00  0:00:00 [ 133k/s] [====================================>] 100%            
-----
filename with spaces: OK
md5summer: OK
md5summer1: OK
md5summer2: OK
.ttt: OK
zenity-info-message.png: OK
-----
184d0995cc8b6d8070f89f15caee35ce  filename with spaces
28227139997996c7838f07cd4c630ffc  md5summer
3383b86a0753e486215280f0baf94399  md5summer1
28227139997996c7838f07cd4c630ffc  md5summer2
31cd03f64a466e680e9c22fef4bcf14b .ttt
670b8db45e57723b5f1b8a63399cdfa1  zenity-info-message.png

Перенаправление в файл, сначала вывод на экран

$ md5summer ".* *" > subdir/save
8,32KiB 0:00:00 [ 180MiB/s] [=============================>                ] 67%
6,00  0:00:00 [ 162k/s] [====================================>] 100%            

, а затем сохраненный вывод

.
$ cat subdir/save 

                    number of files = 6
                    total file size = 12649 B ~ 0 MiB

-----
184d0995cc8b6d8070f89f15caee35ce  filename with spaces
28227139997996c7838f07cd4c630ffc  md5summer
3383b86a0753e486215280f0baf94399  md5summer1
28227139997996c7838f07cd4c630ffc  md5summer2
31cd03f64a466e680e9c22fef4bcf14b .ttt
670b8db45e57723b5f1b8a63399cdfa1  zenity-info-message.png

Проверка iso-файлов

$ md5summer "*.iso"

                    number of files = 10
                    total file size = 7112491008 B ~ 6783 MiB

28,0MiB 0:00:00 [ 160MiB/s] [>                                             ]  0%
10,0  0:00:00 [ 204k/s] [====================================>] 100%            
-----
7a27fdd46a63ba4375896891826c1c88  debian-live-8.6.0-amd64-lxde-desktop.iso
d70eec28cdbdee7f7aa95fb53b9bfdac  debian-live-8.7.1-amd64-standard.iso
382cfbe621ca446d12871b8945b50d20  debian-live-8.8.0-amd64-standard.iso
44473dfe2ee1aad0f71506f1d5862457  debian-live-8.8.0-i386-standard.iso
f396b3532fa84059e7738c3c1827bada  debian-live-9.3.0-amd64-cinnamon.iso
8f6def28ae7cbefa0a6e59407c884466  debian-live-9.6.0-amd64-cinnamon.iso
90b1815da0a5bf4ee4b00eec2b5d3587  debian-testing-amd64-netinst_2017-07-28.iso
8f75074ab98e166b7469299d3e459ac6  mini-amd64-2016-01-21-daily.iso
e580266fba58eb34b05bf6e13f51a047  mini-jessie-32.iso
646c109a9a16c0527ce1c7afa922e2ed  mini-jessie-64.iso
1
27.01.2020, 20:13

Теги

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