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

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

457
задан 16 March 2018 в 00:45

23 ответа

Хотя 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 text DoR в этот ответ , заключается в использовании rsync вместо:

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

Это позволит сохранить права/владение файлами при отображении прогресса.

304
ответ дан 16 March 2018 в 00:45

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

0
ответ дан 16 March 2018 в 00:45

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] [     <=>                                                                   ] 
2
ответ дан 16 March 2018 в 00:45

satu lagi pilihan untuk memelihara atribut mungkin (jika sumber adalah folder maka ia akan dibuat di destinasi )

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

harap mungkin berguna kepada seseorang. Untuk menganggarkan masa pemindahan ini dapat dicapai dengan melakukan sumber do -s terlebih dahulu dan meneruskannya sebagai parameter -s ke pv .

1
ответ дан 16 March 2018 в 00:45

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

#!/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
ответ дан 16 March 2018 в 00:45

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

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

4
ответ дан 16 March 2018 в 00:45

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

, которая регулярно обновляется.

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

9
ответ дан 16 March 2018 в 00:45

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

cv -w

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

11
ответ дан 16 March 2018 в 00:45

Проверьте исходный код progress_bar в нижеприведённом git-репозитории

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

Также попробуйте пользовательский пакет сценариев bash supreme

Загрузите deb-файл и установите его в дистрибутив debian или загрузите файлы исходного кода, модифицируйте и используйте для других дистрибутивов

Обзор функциональности

(1)Открытые приложения ----Firefox ----Калькулятор ----Settings

(2)Manage Files ----Поиск ----Навигация ----Скоростной доступ

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

(3)Управление телефоном ----Приглашение/копия с телефона ----Приглашение/копия на телефон ----Синхронизация папок

(4)Управление USB ----Move/Copy from USB ----Move/Copy to USB

0
ответ дан 16 March 2018 в 00:45

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

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

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

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

11
ответ дан 16 March 2018 в 00:45

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

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

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

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

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

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

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

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

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

watch "du -hs backup/*"

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

9
ответ дан 16 March 2018 в 00:45

В то время как pv может работать с локальными задачами cp , используя dd с pv может обрабатывать как локальные ( cp ), так и удаленные ( scp ) задачи.

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

Убедитесь, что путь / 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
13
ответ дан 16 March 2018 в 00:45

В репозиториях есть инструмент под названием 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)
33
ответ дан 16 March 2018 в 00:45

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

show speed from 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)
...
20
ответ дан 16 March 2018 в 00:45

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

cp -rv old-directory new-directory
33
ответ дан 16 March 2018 в 00:45

Я получаю удовольствие от использования cURL именно для этой цели. На странице руководства указан протокол "FILE" как поддерживаемый, поэтому просто используйте его как любой другой протокол в URL:

curl -o destination FILE://source

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

84
ответ дан 16 March 2018 в 00:45

Нет. См. здесь , чтобы узнать, почему. Хотя он делает больше, чем вам нужно, 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)
259
ответ дан 16 March 2018 в 00:45

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

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

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

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

98
ответ дан 16 March 2018 в 00:45

Вы можете следить за прогрессом, используя watch

cp -r /path/to/your/file/or/dir ./dst

, а во втором терминале вы можете следить за прогрессом

watch -n 0.1 du -h --max-depth=1
1
ответ дан 5 January 2021 в 23:57

Terminal screenshot

Установить gcp

sudo apt-get install gcp

ПРИМЕЧАНИЕ. Убедитесь, что у вас включена поддержка X11, если нет: Добавьте следующую строку в '/ etc / ssh / sshd_config'

ForwardX11Trusted yes

Установить

sudo apt-get install xauth
reboot

Когда все будет готово:

gcp -rv SOURCE_FOLDER DESTINATION_FOLDER

или:

gcp SOURCE_FILE DESTINATION_FILE
0
ответ дан 5 January 2021 в 23:57

Поскольку исходный cp linux не имеет этой функциональности, я использовал следующее решение для получения информации о ходе выполнения:

cp -a source_directory destination_direcotry

Во время работы копии создайте другой командный терминал и перейдите в исходный_директорию как:

cd source_directory
du -sm .

После того, как я получил общий размер source_directory, затем перейду к destination_direcotry, чтобы проделать ту же работу:

cd destination_direcotry
du -sm .

Я мог получить информацию о ходе копирования, сравнив общую разницу в размере между destination_direcotry и source_directory, единственной дополнительной работой вам нужно открыть другой терминал, помимо терминала cp, и набрать "du -sm". чтобы получить общий размер копируемого каталога.

0
ответ дан 5 January 2021 в 23:57

Здесь уже есть несколько действительно отличных ответов, но вот мои любимые команды, включая мой собственный небольшой поворот в команде rsync , с моими любимыми параметрами:

1. watch 'du -hs' позволяет вам наблюдать за увеличением размера целевой папки, если cp уже запущен:

Что делать, если вы уже запустили длинный cp и не хотите останавливать его сейчас?

Предположим, вы уже запустили эту команду копирования:

# recursively copy source_dir_name to destination
cp -r source_dir_name destination

Просто откройте новый терминал с уже выполняющейся операцией копирования и запустите:

# cd into destination directory
cd path/to/destination/source_dir_name
# Now watch, live, the size of this destination grow!
watch 'du -hs'

Это вызовет команда watch для автоматического запуска du -hs каждые 2 секунды (по умолчанию для watch ) внутри вашего целевого каталога, чтобы вы могли видеть размер папки расти в реальном времени! Это не дает вам процент завершения, но если у вас есть приблизительное представление о размере того, что вы копируете, это, безусловно, дает вам что-то, на что можно смотреть и чувствовать себя хорошо, зная, что цель растет. Вот пример вывода на экран часов:

 Каждые 2,0 с: du -hs

2.5G.
 

Здесь вы можете увидеть, что текущий размер текущего каталога (. ) составляет 2,5 ГиБ. Чтобы часы использовали более медленный интервал обновления, например 5 секунд, просто добавьте -n 5 к команде watch , например:

watch -n 5 'du -hs'

2. rsync действительно лучше всего подходит для этого:

Мои любимые команды:

# dry-run
time rsync -rah --dry-run --info=progress2 --stats source destination

# real copy (Important! Do a dry run first and read the
# output summary to ensure you're copying what you intend!)
time rsync -rah --info=progress2 --stats source destination

Примечание: часть time перед вышеприведенными командами просто выводит красивую временную сводку общего время выполнения операции в конце. Это работает перед любой командой Linux.

Вот как выглядит сводка rsync - stats для - пробного запуска , между прочим:

  $ rsync -rah --dry-run --info = progress2 --stats / media / gabriel / cdrom ~ / temp
  2,76 ГБ 100% 2570,10 ГБ / с 0:00:00 (xfr # 3836, to-chk = 0/4837)

Количество файлов: 4837 (рег: 3,836, каталог: 1001)
Количество созданных файлов: 0
Количество удаленных файлов: 0
Количество переданных обычных файлов: 3836
Общий размер файла: 2,76 ГБ
Общий размер переданного файла: 2,76 ГБ
Литеральные данные: 0 байт
Соответствующие данные: 0 байт
Размер списка файлов: 0
Время создания списка файлов: 0,001 секунды
Время передачи списка файлов: 0,000 секунд
Всего отправлено байт: 123,88K
Всего получено байт: 15.54K

отправлено 123,88 Кбайт получено 15,54 Кбайт 278,85 Кбайт / сек
общий размер - 2,76G, ускорение - 19792,78 (СУХОЙ ЗАПУСК)
 

Дополнительное чтение:

  1. Мой длинный ответ на некоторые продвинутые способы использования rsync и прочее: https://superuser.com/questions/1271882/convert-ntfs-partition-to-ext4 -how-to-copy-the-data / 1464264 # 1464264
2
ответ дан 5 January 2021 в 23:57

Не идеальный вариант вы можете открыть второй терминал и сделать

while true; do ls -lh [location/filename]; sleep 2; clear; done

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

0
ответ дан 17 December 2021 в 13:32

Другие вопросы по тегам:

Похожие вопросы: