Як показати прогрес і швидкість передачі при копіюванні файлів на cp?


Відповіді:


249

Хоча cpця функція не має, ви можете використовувати pvце:

pv my_big_file > backup/my_big_file

Примітка. Цей метод втратить права доступу та права власності на файл. Файли, скопійовані таким чином, матимуть такі ж дозволи, як якщо б ви їх створили самі і належатимуть вам.

У цьому прикладі в pvосновному просто виводиться файл на stdout *, який ви перенаправляєте у файл за допомогою >оператора. Одночасно він друкує інформацію про прогрес до терміналу, коли ви це робите.

Ось як це виглядає:

stefano@ubuntu:~/Data$ pv my_big_file > backup/my_big_file
 138MB 0:00:01 [73.3MB/s] [=================================>] 100% 

Можливо, вам доведеться  встановити pv (альтернативно, введіть sudo apt-get install pv) у вашу систему.


*: Технічний біт

У unix-подібній системі є три важливі потоки даних: stdout (стандартний вихід), stderr (стандартна помилка) та stdin (стандартний вхід). У кожній програмі є всі три, так би мовити. >Оператор перенаправлення перенаправляє висновок програми в файл. Без аргументів, як ви бачите вище, >перенаправляє стандартний вихід програми у файл. cpв основному не робить нічого химернішого, ніж

cat source > destination

(де catщойно читає файл і роздруковує його до stdout). pvтак само, як кішка, але якщо ви переспрямовуєте його вихідний потік кудись інше, він надрукує інформацію про прогрес замість stdout.

Погляньте, man pvщоб дізнатися більше про це.


Інший варіант, як пропонує alt текстDoR у цій відповіді , - використовувати замість rsync:

$ rsync -ah --progress source-file destination-file
sending incremental file list
source-file
        621.22M  57%  283.86MB/s    0:00:01

Це дозволить зберегти дозволи / права власності на файли, показуючи прогрес.


3
Це може бути або не бути суттєвим (залежно від ситуації), але pvне обробляє дозволи так само, як cpі ... (на основі одного швидкого тесту, який я намагався: pvне скопіював біт виконання поперек .. rsyncзробив.
Пітер .О

45
IMO: alias cp="rsync -avz"CP є застарілим.
Марко Цеппі

11
Якщо ти схожий на мене, і забудеш про нього pv, ти можеш проскочити /proc/PID of cp/fdі /proc/PID of cp/fdinfoзрозуміти прогрес. (Ви повинні вирішити швидкість.) Я використовую цю техніку для перегляду updatedb.
Танатос

11
Так, -zймовірно, слід використовувати лише для мережевих копій; стиснення та декомпресія даних для локальної копії - це чисті надмірні витрати.
Матвій

3
@MarcoCeppi, при копіюванні каталогу rsyncобов'язково не додайте трейлінг /до вихідного шляху (або видаліть, якщо, наприклад, завершення bash, помістіть його туди автоматично). В іншому випадку ви отримаєте результати, інші, ніж при використанні cp(або gcp).
Пьотр Фіндейзен

185

Немає. Дивіться тут , чому. Хоча це робить більше, ніж потрібно, rsyncмає --progressпараметр. -aБуде тримати дозвіл, і т.д., і -hбуде читабельним людиною.

rsync -ah --progress source destination

Вихід буде виглядати приблизно так:

Pictures/1.jpg
      2.13M 100%    2.28MB/s    0:00:00 (xfr#5898, to-chk=1/5905)
Pictures/2.jpg
      1.68M 100%    1.76MB/s    0:00:00 (xfr#5899, to-chk=0/5905)

4
Це чудово працює в поточному Ubuntu (14.10). Він також підтримує -rпрапор для повторного звернення до каталогів. Він навіть може бути псевдонімом як пряма заміна для cp:alias cp="rsync -ah --progress"
rustyx

1
Працює на OS X, бонус за можливість використовувати інструменти, що входять до системи.
Іван X

3
мені подобається ця альтернатива краще, ніж пв, тим більше, що rsync є частиною стандартної установки
Joao Costa

1
@bartekbrak дякую за обмін. Зараз я перебуваю на macOS 10.12.x, що працює на домашній версії rsync 3.1.2, і за допомогою --progressмоєї голови повертається 🙃, переглядаючи весь вихідний дисплей у терміналі. Тож ті, хто приходить сюди від пошуку ключових слів AOL, rsync -ah --info=progress2 [source] [destination] представляє вихід у трохи більш розумному 👩‍⚕️ способі IMHO.
ipatch

2
На жаль, вихід не дуже корисний при копіюванні багатьох невеликих файлів.
Рафаель

89

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

  • індикація прогресування передачі
  • безперервне копіювання з помилкою (перехід до наступного файлу)
  • журнал статусу копіювання: gcp записує всі свої дії, щоб можна було знати, які файли успішно скопійовано
  • ім'я mangling для обробки обмежень цільової файлової системи (наприклад, видалення несумісних символів "*" або "?" у FAT)

Однак, навіть коли смуга прогресу досягла 100% під час використання інструменту, потрібно зачекати, поки підключиться підказка терміналу, перш ніж безпечно вилучити носій, щоб ви могли переконатися, що процес перенесення успішно закінчився.

gcpвикористовується для копіювання файлів і має такі параметри, --preserveщоб зберегти різні атрибути та дозволи та --recursiveцілі каталоги можна скопіювати. Більш детальну інформацію про її параметри можна отримати, ввівши man gcpабо перейшовши на веб- сайти Ubuntu в Інтернеті . Підручник також доступний на цьому сайті .

Встановити gcpз сховищ за допомогою

sudo apt-get install gcp

( Примітка . У Ubuntu 12.10, наприклад, нова точка автоматичного налаштування є /media/user/usbdisk)

Ви можете скопіювати файл на свій носій, ввівши

gcp /home/mike/file.mp4 /media/usb

і скопіюйте папку на свій носій

gcp -rv ~/Podcasts /media/Mik2

Вибірка вибірки gcpз панелі прогресу:

gcp ~/Videos_incIplayer/mars.flv /media/Mik2
Copying 168.57 MiB 100% |########################################################|   7.98 M/s Time: 00:00:22

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


4
Помилка з нею через sshdbus.exceptions.DBusException: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
msa7

3
якщо у вас на комп'ютері відкритий дисплей X11, його можна просто встановити export DISPLAY=:0.0перед запуском gcp. Якщо машина без голови, то вам доведеться запустити xsession у віртуальний фреймбуфер або щось подібне, тоді, напевно, вам слід просто шукати іншу програму
user292067

2
gcpдосить пристойний, але вимога DBUS / X є дивним. Я обробляв це через SSH за допомогою пересилання ssh: ssh -X user@hostі це дозволило мені запустити його.
Олі

68

Я отримую вихід від використання CURL саме для цієї мети. На головній сторінці вказаний протокол "FILE" як підтримуваний, тому просто використовуйте його, як і будь-який інший протокол у URL-адресі:

curl -o destination FILE://source

Швидкість, прогрес, час, що залишився, і багато іншого - все у звичному форматі.


1
Це чудово, особливо в умовах, коли вам заборонено встановлювати нові інструменти і де rsync недоступний.

5
Блискуче, це повинно бути відомим хаком!
ionreflex

Гарна відповідь! Розумний!
9301293

Імовірно, такий самий недолік, як pvі те, що не дозволить зберігати дозволи.
Плоні

1
Солодке! будь-який спосіб зробити цю роботу для каталогу?
Йосип Радєєв Мота,

28

Хоча він не відображає швидкості, при копіюванні декількох файлів -vпараметр cpкоманди надасть вам інформацію про хід. напр

cp -rv old-directory new-directory

10
Інформація про хід? Це просто багатослівний вихід. Щоб надати інформацію про прогрес, вам, принаймні, знадобиться зараз, скільки файлів або навіть яких файлів потрібно скопіювати.
Джуліан Ф. Вайнерт

Він показує, на якому файлі знаходиться, чого може бути достатньо в менш вимогливих випадках.
Gringo Suave

20

Ядро знає більшість даних, таких як швидкість, а часто і відсоток. Сучасні ядра викривають це через файлову систему / proc.

showpeed з https://github.com/jnweiger/showspeed використовує цю інформацію. Він може приєднуватися до вже запущених програм і періодично оновлювати такі:

$ dd if=bigfile of=/tmp/otherbigfile &
$ showspeed dd
dd looks like a process name. pid=4417 matches av0=dd.
p/4417/fd/0r /home/jw/bigfile 113MB/s (12%, 2.3GB)  9m:35
p/4417/fd/1w /tmp/otherbigfile 182MB/s (2.6GB)
p/4417/fd/0r /home/jw/bigfile 285MB/s (15%, 3.0GB)  8m:08
p/4417/fd/0r /home/jw/bigfile 115MB/s (16%, 3.2GB)  8m:01
p/4417/fd/0r /home/jw/bigfile 107MB/s (17%, 3.4GB)  7m:39
p/4417/fd/1w /tmp/otherbigfile 104MB/s (3.5GB)
p/4417/fd/0r /home/jw/bigfile 139MB/s (19%, 3.7GB)  7m:37
p/4417/fd/0r /home/jw/bigfile 116MB/s (20%, 3.9GB)  7m:18
p/4417/fd/1w /tmp/otherbigfile  67MB/s (4.0GB)
p/4417/fd/1w /tmp/otherbigfile 100MB/s (4.1GB)
...

Хороший. Як це працює, проте, відсотки? Я здогадуюсь лише у випадку, коли файл відкритий лише для читання? І, мабуть, це не спрацює у випадку розсіяного доступу.
j_kubik

1
У цьому випадку ви також можете використовувати інший термінал для запуску, pkill -USR1 ddщоб змусити ddпоказувати його статус, інший варіант watch -n 1 pkill -USR1 dd- зробити так, щоб він показував свій прогрес періодично (щосекунди).
Ярон

Правильно. Багато інструментів отримали вбудований спосіб звітувати про статистику за час. dd не є винятком. Сучасні реалізації мають параметр status = progess. Showspeed - це класичний унікс-стиль у стилі "один інструмент для однієї мети" - як і у форматі pv. Але у нього є різні випадки використання: подумайте про чашки, що завантажують файл через ghostscript, або ви хочете дізнатися про ETA для поточного CP або tar. Це може бути на 95% зроблено вже через кілька годин, і ви, ймовірно, не хочете перезавантажувати це лише для того, щоб додати PV ... Розсіяний доступ не працюватиме добре. Тільки покази зразків шукають позиції.
Юрген Вайгерт

18

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

Встановіть його за допомогою команди

sudo apt-get install progress

Цей інструмент можна використовувати так:

cp bigfile newfile & progress -mp $!

Вихід:

[11471] cp /media/Backup/Downloads/FILENAME.file 
        29.9% (24.2 MiB / 16 MiB)

12

У той час як pvможе впоратися з локальними cpзавданнями, використовуючи ddз pvможе працювати як з локальними ( cp) і віддалених ( scp) завдань.

dd if=path/to/source.mkv | pv | dd of=path/to/dest.mkv

Перевірте, будь ласка, path/to/dest.mkvвиходиtouch path/to/dest.mkv

Це може показувати прогрес, але якщо ви хочете відсоткову інформацію,

dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv

Замініть 100Mвище реальний розмір вихідного файлу.

Тут виходить віддалена частина

Хоча scpнавряд чи може показати поточний прогрес, використовуючи ddз pvшматок пирога.

ssh onemach@myotherhost dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv


11

Існує новий інструмент під назвою cv, який може знайти будь-який дескриптор, пов’язаний із запущеною командою та показувати хід та швидкість: https://github.com/Xfennec/cv

cv -w

виводить статистику для всіх запущених операцій cp, mv тощо


watch cv -qще акуратніше
nwgat

Він показує лише прогрес для окремих файлів, він усвідомлює, чи cpкопіює каталог рекурсивно чи ні.
Flimm

1
Війна перейменована на прогрес. Чудовий інструмент!
себастьян

7

Як багато хто говорив, cp не включає цю функціональність.

Тільки, щоб кинути свої 0,02 долара, що я зазвичай роблю у тривіальних ситуаціях копіювання (тобто ні -R):

  1. Подивіться, наскільки великий файл і пам’ятайте

  2. Почніть копіювання

  3. Відкрийте інший термінал

  4. Виконати watch ls -lh DIRв каталозі, де знаходиться ціль

Це може тримати мене в курсі розміру цільового файлу, з цілком мінімальними клопотами.

В якості альтернативи для менш тривіальних ситуацій, наприклад, рекурсивного копіювання каталогів, ви можете watch du -hs DIRпереглянути підсумки розміру DIR. Однак для обчислення може знадобитися багато часу і навіть уповільнити копіювання, тому ви можете використовувати -n INTERVALаргумент для перегляду, щоб компроміс був прийнятним.

Оновлення: Якщо ви використовуєте макіяж-команди з командою, яка використовується для watch du, наприклад watch du -hs backup/*, не забудьте процитувати:

watch "du -hs backup/*"

в іншому випадку диві картки будуть розгорнуті лише один раз , коли дивитися буде запущено, тому ду не буде шукати нові файли / підкаталоги.


Не відповідає на частину "швидкості", хоча ...
Алоїз Магдал

7

dd status=progress

Додана опція у GNU Coreutils 8.24+ (Ubuntu 16.04):

dd if=src of=dst status=progress

Термінал показує рядок типу:

462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s

Дивіться також: Як Ви відстежуєте хід ДД?


1
Ви мали на увазі: stdout - це потік символів і послідовностей vt100 втечі, завдяки яким ваш термінал відображається періодично оновленою лінією;). stdout - це завжди потік байтів і не має нічого спільного з тим, як він відображається (за винятком того, що програма може знати, приєднана вона до терміналу чи ні ...)
masterxilo

@masterxilo newbs не хвилюватиметься, фахівці будуть знати ;-) hehe
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Я думаю, що завжди добре викладати такі речі, як вони, можливо, залишаючи деякі деталі, але ніколи не змушуйте своїх читачів створювати неправильну ментальну модель. Якщо ви говорите, що "stdout - це (періодично оновлюється) рядок", вам здається, ви говорите, що stdout - це блок пам'яті, що змінюється, а це не так. Це важливо знати навіть для новачків.
masterxilo

6

Якщо у вас rsync 3.1 або вище ( rsync --version), ви можете скопіювати (cp -Rpn), зберігаючи дозволи та права власності, повторювати каталоги, "без клобара" та відображати загальний прогрес (замість просто прогресу за файлом), швидкість копіювання та ( дуже приблизний) приблизний час, що залишився:

sudo rsync -a --info=progress2 --no-i-r /source /destination

Зауважте, що sudo потрібен лише у випадку, коли ви маєте справу з каталогами / файлами, якими ви не володієте. Крім того, без цього --no-i-rвідсоток може бути скинутий до нижчого числа в якийсь момент під час копіювання. Можливо, пізніші версії rsync за замовчуванням становлять no-ir з info = progress2, але це не в поточній версії 3.1.2.

Я виявив, що відсоток і час, що залишився, значно завищені при копіюванні в каталог, який вже містить файли (наприклад, коли ти зазвичай використовуєш cp -n "no clobber").


3

Використовуйте сценарій оболонки:

#!/bin/sh
cp_p()
{
   strace -q -ewrite cp -- "${1}" "${2}" 2>&1 \
      | awk '{
        count += $NF
            if (count % 10 == 0) {
               percent = count / total_size * 100
               printf "%3d%% [", percent
               for (i=0;i<=percent;i++)
                  printf "="
               printf ">"
               for (i=percent;i<100;i++)
                  printf " "
               printf "]\r"
            }
         }
         END { print "" }' total_size=$(stat -c '%s' "${1}") count=0
}

Це буде виглядати так:

% cp_p /home/echox/foo.dat /home/echox/bar.dat
66% [===============================>                      ]

Джерело


3

Залежно від того, що ви хочете зробити, Midnight Commander ( mc) може бути відповіддю. Я здивований, що це ще не було згадано.

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


2
"це доступно поза коробкою для більшості систем." ... не на будь-якій установці Ubuntu за замовчуванням.
муру

1

ще одним варіантом збереження атрибутів може бути (якщо sourceпапка буде створена в destination)

tar -c source | pv -e -t -p -r | tar -C destination  -x

сподіваюся, що комусь це може бути корисно. Оцінивши час передачі, це можна досягти, виконавши do -s sourceзаздалегідь і передавши його як -s <size>параметр pv.


-f -є зайвим. tarЗа замовчуванням вихід cі вхід для x- stdout та stdin.
муру

Чи може це залежати від версії ОС / tar? Я знаю, що це сайт Ubuntu, але це може бути корисно для інших власників ОС, таких як macOS
ciekawy

1
Ні. Усі розумні реалізації (включаючи tar libarchive, який використовує macOS) мають таку поведінку.
муру

щойно перевірено на macos, і ваша пропозиція цілком справедлива - я оновив свою відповідь. Дякую!
ciekawy

0

Ви можете скопіювати використання будь-якої програми. У той же час ви можете запустити sudo iotopта побачити фактичну швидкість читання / запису диска, але без прогресу.


0

Перевірте вихідний код на прогрес_бар у нижньому сховищі git

https://github.com/Kiran-Bose/supreme

Крім того, спробуйте призначений для користувача пакет Баш скрипт верховна

Завантажте файл deb та встановіть у дистрибутиві на основі debian або завантажте вихідні файли, модифікуйте та використовуйте для інших дистрибутивів

Огляд функціональності

(1) Відкрити програми ---- Firefox ---- Калькулятор ---- Налаштування

(2) Управління файлами ---- Пошук ---- Навігація ---- Швидкий доступ

            |----Select File(s)
            |----Inverse Selection
            |----Make directory
            |----Make file
                                          |----Open
                                          |----Copy
                                          |----Move
                                          |----Delete
                                          |----Rename
                                          |----Send to Device
                                          |----Properties

(3) Керування телефоном ---- Переміщення / Копіювання з телефону ---- Переміщення / Копіювання на телефон ---- Синхронізація папок

(4) Керування USB ---- Переміщення / копіювання з USB ---- Переміщення / копіювання на USB


0

pv знає, як переглядати дескриптори файлів, надані pid, чи це cp чи щось інше

З документації:

   (Linux only): Watching file descriptor 3 opened by another process 1234:

          pv -d 1234:3

   (Linux only): Watching all file descriptors used by process 1234:

          pv -d 1234

Приклад:

md5sum file &
[1] + 1271 suspended
pv -d 1271
417MiB 0:00:17 [12,1MiB/s] [============>                                 ] 29% ETA 0:00:53

$ cp file.mov copy.mov &
[2] 3731
$ pv -d 3731
3:/media/windows/file.mov:  754MiB 0:00:04 [97,2MiB/s] [======================>                       ] 52% ETA 0:00:07
4:/media/windows/copy.mov:  754MiB 0:00:04 [97,3MiB/s] [     <=>                                                                   ] 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.