Як я використовую zip, як я можу відображати загальний прогрес без заповнення командного рядка?


25

Ідеальною буде смуга ходу фіксованої довжини, кількість файлів чи байтів, а ще краще таймер, що показує, що очікується час, що залишився.

zipСтандартною поведінкою, здається, є друк рядка для кожного обробленого файлу, але я не хочу, щоб ця інформація перевантажувалася, коли я копіюю тисячі файлів. Я хочу здогадатися, скільки часу це займе.

Я спробував параметр -q( --quiet) у поєднанні з -dg( --display-globaldots), але це просто затоплює stdout декількома лініями крапок і не дає корисної вказівки.

Я також спробував, -qdgds 10mяк згадувалося на сторінці man, але отримав такий же результат.

Потім я спробував -db( --display-bytes) і -dc( --display-counts), але, здається, не існує глобального варіанту, тому він знову друкує його для кожного імені файлу.

Нарешті, я спробував це разом з -qподібними -qdbdc, але це просто не дає нічого.

Як не дивно, я знайшов сторінку man на сайті info-zip, де згадується параметр -de( --display-est-to-go), який повинен "Показувати оцінку часу на завершення операції архівування".

Це звучить точно так, як я хочу, але проблема полягає в тому, що моя версія zipне має такої функції. Я використовую Ubuntu 14.04.1 64bit, bash-4.3.30 (1) та zip-3.00. За даними Вікіпедії, це останній стабільний реліз zip.

На сторінці info-zip sourceforge є неопубліковані бета-версії, але я краще не довіряю свої дані бета-версії.


Запишіть вихід у файл та використовуйте його для надання інформації високого рівня tee. Перш ніж запустити zip, зробіть загальний підрахунок файлів (з lsабо find -type f), і, поки він блискавить, прочитайте файл журналу про кількість рядків оброблених файлів, які він уже має ( grepдля правильних рядків для перегляду та wc -lдля рядків кількість), тому інформація на високому рівні відобразить щось на кшталт "файли обробляються 234/76438";
Сила Водолія

ви можете працювати з тимчасовим інтервалом, враховуючи загальний розмір файлів і перевіряючи розмір тих, що вже були оброблені; але ... навіть файли однакового розміру потребують різного часу на обробку, тому це завжди буде дикою здогадкою ...
Power Aquarius Power

Я не знаю, чи можна використовувати stdin під час створення ZIP-файлів, але якщо gzip нормальний, ви можете зробити щось на кшталтpv /path/to/file | gzip > /path/to/file.gz
DopeGhoti

Відповіді:


11

zipможе стискати дані до стандартного виводу. Отже, ви можете комбінувати його з іншими інструментами, такими як pv:

zip -qr - [folder] | pv -bep -s $(du -bs [folder] | awk '{print $1}') > [file.zip]

Видаліть один із -bepваріантів як зручність.


Дякую за це! Я роблю це на своєму mac (варити встановити pv, варити встановити coreutils і замінити du на gdu).
Джефф

6

Якщо ви все добре використовуєте 7z:

7z a output.zip folder/

Це дасть вам такий рівень прогресу:

Open archive: test.zip
--
Path = test.zip
Type = zip
Physical Size = 232039663

Scanning the drive:
3 folders, 2401 files, 238122225 bytes (228 MiB)

Updating archive: test.zip

Items to compress: 2404

 16% 279 U folder/file.txt  

2

Я успішно використовував наступне:

zip -r [target_zip] [folder_to_zip] 2>&1 | 
pv -lep -s $(ls -Rl1 [folder_to_zip] | egrep -c '^[-/]') > /dev/null

І це пояснено нижче:

zip -r [target_zip] [folder_to_zip] 2> & 1 |

рекурсивно посилайте у [target_zip] файл [folder_to_zip], перенаправляючи stderr на stdout. Зауважте, що stderr буде містити по одному рядку для кожного файлу та каталогу, які обробляються.

pv -lep -s $ (ls -Ral1 [folder_to_zip] | egrep -c '^ [- /]')> / dev / null

передайте в ПВ рядки з назви файлів, коли вони виводяться з zip. pv працює в лінійному режимі (підрахунок прогресу на основі рядків і розміру також в кількості рядків, яких слід очікувати - див. сторінку PV man--l ).

Загальний розмір очікуваних рядків збирається шляхом рекурсивного переліку (ls) [folder_to_zip] та підрахунку рядків, що починаються з '-' або 'd', тобто всіх файлів і каталогів (пам'ятайте, що каталоги перераховані починаючи з '/') .

Вищезазначене забезпечує точний відсоток завершення, оскільки 100% досягається, коли всі файли та каталоги були оброблені.

Проблема з відповіддю педроаперо полягає в тому, що прогрес обчислюється за кількістю байтів, оброблених (стислих) над загальною кількістю байтів, які обробляються (нестиснені). В результаті процес завершиться приблизно на 30% (залежно від швидкості стиснення).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.