Как показать прогресс и скорость передачи при копировании файлов с помощью cp?

326

Иначе, есть ли альтернативная утилита командной строки, которая может этого добиться?

Оливье Лалонд
источник

Ответы:

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просто читает файл и печатает его на стандартный вывод). pvточно так же, как cat, но если вы перенаправите его поток вывода куда-то еще, он вместо этого выведет информацию о прогрессе в stdout.

Посмотрите, man pvчтобы узнать больше об этом.


Другой вариант, как альтернативный текст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сделал.
Питер .O
45
ИМО: alias cp="rsync -avz"cp устарел.
Марко Чеппи
11
Если вы похожи на меня и забыли о чем-то pv, вы можете подглядывать /proc/PID of cp/fdи /proc/PID of cp/fdinfoвыяснять прогресс. (Это зависит от вас, чтобы определить скорость.) Я использую эту технику, чтобы посмотреть updatedb.
Танатос
11
Да, -zвероятно, следует использовать только для сетевых копий; сжатие и распаковка данных для локальной копии - это просто накладные расходы.
Мэтью Прочитал
3
@MarcoCeppi, при копировании каталога rsyncубедитесь, что не добавляете трейлинг /к исходному пути (или удаляете, если, например, bash complete помещает его туда автоматически). В противном случае вы получите результаты, отличные от использования 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)
bartekbrak
источник
4
Это прекрасно работает в текущей Ubuntu (14.10). Он также поддерживает -rфлаг для рекурсии каталогов. Это может даже быть псевдоним как прямая замена для cp:alias cp="rsync -ah --progress"
rustyx
1
Работает безупречно на OS X, с преимуществом возможности использовать инструменты, включенные в систему.
Иван Икс
3
мне нравится эта альтернатива лучше, чем pv, особенно потому, что rsync является частью стандартной установки
Joao Costa
1
@bartekbrak спасибо, что поделились. В настоящее время я работаю на macOS 10.12.x под управлением домашней версии rsync 3.1.2 и использую --progressзаставляет мою голову крутиться 🙃, наблюдая за всем выводом на дисплей в терминале. Таким образом, те, кто приходят сюда из поиска по ключевым словам AOL, rsync -ah --info=progress2 [source] [destination] представляют результаты немного более вменяемым образом, ИМХО.
августа
2
К сожалению, вывод не очень полезен при копировании множества маленьких файлов.
Рафаэль
89

Если вы хотите увидеть , если ваши передачи файлов правильно , вы можете использовать gcpи gcp, как сП , но по умолчанию дает вам прогресс бар , так что вы можете увидеть , что копируется. Как отмечает вики программы , gcpимеет несколько полезных функций, таких как

  • индикация хода передачи
  • непрерывное копирование при ошибке (перейти к следующему файлу)
  • регистрация состояния копирования: gcp регистрирует все свои действия, чтобы можно было узнать, какие файлы были успешно скопированы
  • изменение имени для обработки ограничений целевой файловой системы (например, удаление несовместимых символов "*" или "?" в 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 для этой цели. Страница man содержит список поддерживаемых протоколов «FILE», поэтому просто используйте его как любой другой протокол в URL:

curl -o destination FILE://source

Скорость, прогресс, оставшееся время и многое другое - все в привычном формате.

mathemagician
источник
1
Это прекрасно, особенно в средах, где вам запрещено устанавливать новые инструменты и где rsync недоступен.
5
Гениально, это должен быть известный хак!
ionreflex
Хороший ответ! Умная!
9301293
Это по- видимому , имеет тот же недостаток , как pv, что он не будет сохранять разрешения.
Плони
1
Сладкий! любой способ заставить это работать для каталога?
Джозеф Раджив Мота
28

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

cp -rv old-directory new-directory
Ubuntourist
источник
10
Прогресс информация? Это просто подробный вывод. Чтобы предоставить информацию о прогрессе, вам, по крайней мере, теперь нужно узнать, сколько файлов или даже какие файлы необходимо скопировать.
Джулиан Ф. Вейнерт
Он показывает, в каком файле он находится, что может быть достаточно в менее требовательных случаях.
Гринго Суаве
20

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

ShowSpeed ​​из 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периодически показывать его прогресс (каждую секунду).
Ярон
Правильно. Многие инструменты получили встроенный способ сообщать статистику с течением времени. дд не исключение. Современные реализации имеют опцию status = progess. Showspeed - это классическое решение Unix в стиле «один инструмент для одной цели», как и в pv. Но у него есть разные варианты использования: подумайте о чашках, прокачивающих файл через ghostscript, или вы хотите узнать ETA для текущего cp или tar. Это может быть сделано на 95% уже через несколько часов, и вы, вероятно, не хотите перезапускать это, просто чтобы добавить pv ... Разрозненный доступ не будет работать хорошо. Showspeed только образцы ищут позиции.
Юрген Вейгерт
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задачами, использование ddwith 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
onemach
источник
1
Более новыйdd имеет status=progress: askubuntu.com/a/824895/52975
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件
11

Существует новый инструмент cv, который может найти любой дескриптор, связанный с запущенной командой, и показать прогресс и скорость: https://github.com/Xfennec/cv

cv -w

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

naugtur
источник
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. Однако для вычислений du может потребоваться много времени и даже замедлить копирование, поэтому вы можете использовать -n INTERVALаргумент для просмотра, чтобы компромисс был приемлемым.

Обновление: если вы используете подстановочные знаки с командой, используемой с watch du, например watch du -hs backup/*, не забудьте процитировать:

watch "du -hs backup/*"

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

Алоис Махдал
источник
Не отвечает на «скоростную» часть, хотя ...
Alois Mahdal
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

Смотрите также: Как вы контролируете прогресс дд?

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
источник
1
Вы имели в виду: stdout - это поток символов и escape-последовательностей vt100, которые заставляют ваш терминал отображать периодически обновляемую строку;). stdout всегда является потоком байтов и не имеет никакого отношения к тому, как он отображается (за исключением того, что приложение может знать, подключено ли оно в настоящее время к терминалу или нет ...)
masterxilo
Новички @masterxilo не будут волноваться, эксперты будут знать ;-) хе-хе
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件
Ну, я думаю, что всегда хорошо говорить о таких вещах, как они, возможно, опуская некоторые детали, но никогда не заставляйте своих читателей создавать неправильную ментальную модель. Если вы говорите «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вычисляет размер и затем очень хорошо отображает прогресс. Плюс он доступен из коробки на большинстве систем.

kralyk
источник
2
«это доступно из коробки на большинстве систем». ... не на любой установке по умолчанию Ubuntu.
Муру
1

Еще один вариант сохранения атрибутов может быть (если sourceэто папка, в которой он будет создан destination)

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

надеюсь, что это может быть полезно для кого-то. Чтобы рассчитать время передачи, это можно сделать, сделав do -s sourceзаранее и передав его в качестве -s <size>параметра pv.

ciekawy
источник
-f -избыточно tarПо умолчанию для вывода cи ввода xиспользуются stdout и stdin.
Муру
Может ли это зависеть от версии OS / tar? Я знаю, что это сайт Ubuntu, но это может быть полезно для других владельцев ОС, таких как macOS
ciekawy
1
Нет. Все вменяемые реализации (включая tar-архив libarchive, который использует macOS) имеют такое поведение.
Муру
только что проверено на macos, и ваше предложение совершенно верно - я обновил свой ответ. Спасибо!
Ciekawy
0

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

McKelvin
источник
0

Проверьте исходный код для progress_bar в приведенном ниже хранилище 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] [     <=>                                                                   ] 
alecail
источник