Прогресс и скорость с помощью «cp»?

250

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

задан Olivier Lalonde 14.12.2010 в 05:48
источник

15 ответов

189

Пока 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 , чтобы узнать больше об этом.

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

  

rsync -ah --progress source-file destination      

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

    
ответ дан Stefano Palazzo 14.12.2010 в 06:17
источник
110

Нет. См. здесь о том, почему. Хотя он делает больше, чем вам нужно, 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 15.10.2012 в 10:06
источник
81

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

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

    
ответ дан user76204 15.10.2012 в 13:09
источник
49

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

curl -o destination FILE://source

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

    
ответ дан mathemagician 02.02.2013 в 10:00
источник
21

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

cp -rv old-directory new-directory
    
ответ дан Ubuntourist 14.12.2010 в 18:17
источник
16

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

showpeed из Ссылка использует эту информацию. Он может подключаться к уже запущенным программам и периодически предоставлять такие обновления:

$ 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ürgen Weigert 25.02.2014 в 15:34
источник
11

В то время как 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
    
ответ дан onemach 05.01.2013 в 09:08
источник
8

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

cv -w

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

    
ответ дан naugtur 13.07.2014 в 13:33
источник
8

В репозиториях есть инструмент, называемый 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)
    
ответ дан Nathaniel A Malinowski 27.09.2016 в 00:35
источник
5

Как многие говорили, cp не включает эту функциональность.

Просто чтобы бросить мои 0,02 доллара, что я обычно делаю с тривиальными ситуациями копирования (т. е. нет -R ):

  1. Посмотрите, насколько велик файл и помните

  2. Начать копирование

  3. Открыть другой терминал

  4. Запустите watch ls -lh DIR в каталоге, где цель

Это поможет мне обновить размер целевого файла с минимальными трудностями.

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

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

watch "du -hs backup/*"

иначе wild-cards будут расширены только один раз , когда часы запущены , поэтому du не будет смотреть на новые файлы / подкаталоги.

    
ответ дан Alois Mahdal 16.11.2012 в 14:20
источник
3

dd status=progress

Добавлена ​​опция в GNU Coreutils 8.24+ (Ubuntu 16.04):

dd if=src of=dst status=progress

Stdout - это периодически обновляемая строка, например:

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

См. также: Как вы отслеживаете прогресс dd?     

ответ дан Ciro Santilli 包子露宪 六四事件 法轮功 14.09.2016 в 18:18
источник
2

Используйте сценарий оболочки:

#!/bin/sh
cp_p()
{
   strace -q -ewrite cp -- "" "" 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' "") count=0
}

Это будет выглядеть так:

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

Источник

    
ответ дан Jan 01.09.2014 в 15:45
источник
2

В зависимости от того, что вы хотите сделать, Midnight Commander ( mc ) может быть ответом. Я удивлен, что он еще не упоминался.

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

    
ответ дан kralyk 30.01.2016 в 18:33
источник
2

Если у вас есть rsync 3.1 или выше ( rsync --version ), вы можете копировать (cp -Rpn), сохраняя разрешения и права собственности, каталоги recurse, «no clobber» и отображая общий прогресс (а не просто прогресс по файлу) , скорость копирования и (очень грубое) расчетное время, оставшееся с помощью:

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

Обратите внимание, что sudo требуется только при работе с каталогами / файлами, которые у вас нет. Кроме того, без --no-i-r процент может сбрасываться на меньшее число в какой-то момент во время копирования. Возможно, более поздние версии rsync будут по умолчанию для no-i-r с информацией = progress2, но это не в текущей версии 3.1.2.

Я обнаружил, что процент и оставшееся время сильно завышены при копировании в каталог, который уже содержит файлы (например, когда вы обычно используете cp -n «no clobber»).

    
ответ дан S Lentz 02.03.2016 в 23:22
источник
0

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

    
ответ дан McKelvin 11.01.2018 в 16:47
источник

Ознакомьтесь с другими вопросами по меткам