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


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


271
2017-12-14 04:48


Источник




Ответы:


В то время как 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 (стандартный ввод). В каждой программе есть все три, так сказать. > redirection оператор перенаправляет вывод программы в файл. Без аргументов, как вы видите выше, > перенаправляет программу стандартный выход в файл. cp в основном не делает ничего более привлекательного, чем

cat source > destination

(где cat просто читает файл и печатает его на stdout). pv как кошка, но если вы перенаправите его выходной поток где-то в другом месте, он будет печатать информацию о ходе работы в stdout.

Взгляни на man pv чтобы узнать больше об этом.


Другой вариант, поскольку alt textDoR предлагает в этот ответ, заключается в использовании rsync:

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

Это позволит сохранить права доступа / права на файлы при показе прогресса.


204
2017-12-14 05:17



Это может быть или не быть значительным (в зависимости от ситуации), но pv не обрабатывает разрешения так же, как cp делает ... (на основе одного быстрого теста я пробовал: pv не копировал бит выполнения через. rsync сделал. - Peter.O
IMO: alias cp="rsync -avz" cp устарел. - Marco Ceppi♦
Если вы похожи на меня и забываете о pv, вы можете пойти в snooping в /proc/PID of cp/fd а также /proc/PID of cp/fdinfo для выяснения прогресса. (Это зависит от вас, чтобы вывести скорость.) Я использую эту технику для просмотра updatedb, - Thanatos
Да, -z вероятно, должны использоваться только для сетевых копий; сжатие и распаковка данных для локальной копии - это чистые накладные расходы. - Matthew Read
@Rodrigo rsync -avzP это то, что вы хотите использовать. - Marco Ceppi♦


Нет. Видеть Вот почему. Хотя он делает больше, чем вам нужно, 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)

129
2017-10-15 08:06



Это отлично работает в текущем Ubuntu (14.10). Он также поддерживает -r флаг для рекурсии каталогов. Он может быть даже псевдонимом как прямая замена для cp: alias cp="rsync -ah --progress" - rustyx
Работы набухают на OS X с бонусом к возможности использования инструментов, входящих в систему. - Ivan X
это здорово, результат выглядит filename MB-copied MB-speed time-remaining) - Rudolf Olah
Мне нравится эта альтернатива лучше, чем pv, особенно потому, что rsync является частью стандартной установки - Joao Costa
@bartekbrak благодарит за обмен. В настоящее время я на macOS 10.12.x запускает домашнюю версию rsync 3.1.2 и использует --progress заставляет мою голову закручивать все выходные данные в терминале. Таким образом, те, которые приходят из поисковых запросов AOL, rsync -ah --info=progress2 [source] [destination]  представляет результат немного более разумным способом IMHO. - Chris


Если вы хотите, чтобы ваши файлы были правильно переданы, вы можете использовать gcp а также gcp как cp, но по умолчанию дает вам индикатор выполнения, чтобы вы могли видеть, что копируется. Поскольку программа Вики-заметки, 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,


84
2017-10-15 11:09



Получил ошибку с ним по ssh dbus.exceptions.DBusException: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11 - msa7
если у вас есть дисплей X11, открытый на машине, вы можете просто установить export DISPLAY=:0.0 перед запуском gcp. Если машина безголовна, вам нужно будет запустить xsession в виртуальный фреймбуфер или что-то еще, в этот момент вам, вероятно, стоит просто искать другую программу - user292067
gcp довольно приличный, но требование DBUS / X является нечетным. Я обработал это через SSH, используя ssh forwarding: ssh -X user@host и это позволило мне запустить его. - Oli♦


Я получаю удовольствие от использования cURL для этой конкретной цели. Страница руководства перечисляет протокол «ФАЙЛ» как поддерживаемый, поэтому просто используйте его, как и любой другой протокол в URL-адресе:

curl -o destination FILE://source

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


53
2018-02-02 09:00



Это замечательно, особенно в средах, где вам запрещено устанавливать новые инструменты и где rsync недоступен.
Блестящий, это должен быть известный хак! - ionreflex
Хороший ответ! Умная! - 9301293
Это, по-видимому, имеет такой же недостаток в виде pv, что он не сохранит разрешения. - Ploni


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

cp -rv old-directory new-directory

22
2017-12-14 17:17



Информация о прогрессе? Это просто подробный вывод. Чтобы предоставить информацию о ходе работы, вам, по крайней мере, нужно будет теперь, сколько файлов или даже файлов необходимо скопировать. - Julian F. Weinert


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

показывает скорость от 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)
...

19
2018-02-25 14:34



Хороший. Как это работает, проценты? Думаю, только в том случае, если файл открыт только как прочитанный? И это, вероятно, не будет работать в случае разброса доступа. - j_kubik
В этом случае вы также можете использовать другой терминал для запуска pkill -USR1 dd делать dd показать свой статус, другой вариант watch -n 1 pkill -USR1 dd чтобы он периодически показывал свой прогресс (каждую секунду). - Yaron
Правильно. Многие инструменты получили встроенный способ сообщать статистику с течением времени. dd не является исключением. Современные реализации имеют параметр status = progess. Showspeed - это классический стиль Unix для «одного инструмента для одной цели» - как и pv. Но у него разные операции: подумайте о том, как чашки накачивают файл через ghostscript или вы хотите знать ETA для текущего cp или tar. Это может быть выполнено на 95% уже через несколько часов, и вы, вероятно, не хотите перезапускать это только для добавления pv ... Рассеянный доступ не будет работать хорошо. Шосспид только образцы ищут позиции. - Jürgen Weigert


В то время как 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
2018-01-05 08:08



Новее dd имеет status=progress: askubuntu.com/a/824895/52975 - Ciro Santilli 新疆改造中心 六四事件 法轮功


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

cv -w

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


10
2017-07-13 11:33



watch cv -q даже опрятный - nwgat
Он показывает только прогресс для отдельных файлов, он осознает, cp копирует каталог рекурсивно или нет. - Flimm
Война переименована в прогресс. Отличный инструмент! - sebastian