Можно ли увидеть скорость копирования и процент копий?


251

У меня проблемы при копировании больших файлов с помощью nautilus (он застревает). Мне нужно скопировать, используя cp. Я хотел бы знать, есть ли какие-либо параметры, которые показывают скопированный%, а также скорость передачи.


39
Вы могли бы использовать rsyncвместо cp. У него есть --progressопция.
frostschutz

2
Midnight Commanderтакже хорошо работает, и имеет симпатичный текстовый интерфейс с индикаторами выполнения, но может быть не установлен. Попробуйте mcв командной строке. Кроме того, очевидно, это не так cp.
CVn

3
Использование rsyncс --progressтолько что заставило меня понять, что происходит. Он застревает, когда достигает 100%, а затем длится пару минут в итоге. Я думаю, что то же самое, что происходит с наутилусом. В любом случае, это уже другой вопрос, поэтому лучший ответ на этот вопрос - rsync --progressон показывает размер,%, скорость и прошедшее время.
YZT

2
одна проблема с rsync заключается в том, что он работает медленнее, чем чистая копия. На моем большом сервере разница составляет 60 МБ / с и 300 МБ / с соответственно.
pdwalker

1
@pdwalker даже с -Wопцией? на всех моих хостах rsyncпочти так же быстро, как cp... так близко, что я регулярно использую rsyncвместо cp.
Skaperen

Ответы:


194

rsyncимеет флаг, progress2который показывает общий процент:

rsync --info=progress2 source dest

5
--info = progress2 все еще не превратил его в репозиторий по умолчанию, и вот он 2015 год. Похоже, хорошая идея.
Lonniebiz

1
--info=progress2наконец включен version 3.1.0 protocol version 31. Может быть, вы могли бы отредактировать свой ответ, YZT.
Сопалахо де Арриерес

1
Я заметил, --info=progress2что rsync пылает быстро! 200 МБ / с, в то время как Windows идет не дальше 90 МБ / с!
ReneFroger

1
@ReneFroger, хотя это может быть реальная скорость (в зависимости от устройства), часто в Linux эта быстрая скорость действительно ложна, и после завершения копирования система все еще выполняет запись на устройство, в отличие от Windows, в которой вы можете извлечь устройство почти сразу же. Если вы копируете большие файлы, вы можете заметить, как он запускается с такой высокой скоростью, но затем он падает до стандартного.
yzT

7
у меня сработало просто --progress. rsync версия 3.0.9
adrianTNT

103

Если вы разрешите другие инструменты, чем cpэто возможно. Для одного файла вы можете использовать pv. Это небольшой инструмент, предоставляющий хорошую статистику.

pv inputfile > outputfile

Если у вас есть несколько файлов или каталогов, вы можете использовать tar:

tar c sourceDirectory | pv | tar x -C destinationDirectory

Вы можете обернуть его в функцию оболочки. Меньше печатать, и вы получаете семантику, близкую к семантике cp. Вот очень простая (и не защищенная от ошибок!) Функция:

cpstat () {
  tar c "$1" | pv | tar x -C "$2"
}

Обратите внимание, что некоторые версии tarне поддерживают вышеупомянутый синтаксис (например, Solaris tar), и вы должны использовать следующий вариант:

cpstat () {
  tar cf - "$1" | pv | (cd "$2";tar xf -)
}

Вы называете это так

cpstat sourceDirectory destinationDirectory

Вы можете улучшить его, чтобы pvполучить оценку оставшегося времени.

Другое решение (как упомянуто в комментарии о frostschutz) - использовать rsync с --progressопцией:

rsync --progress -a sourceDirectory destinationDirectory

1
cpstat собирается в пастбище =)
Мэтт

7
Это даст вам скорость передачи, но не ETA, потому pvчто не знает, сколько данных поступит через канал. Вы можете указать это, используя -s. Например , сначала сделать , du -sh sourceDirectoryчтобы получить (грубый) идею, а затем передать его pv, как это: pv -s 100m.
Ян Фабри

1
--info = progress2 дает вам статистику прогресса на уровне каталога.
AlexLordThorsen

vbuf(Debian, Ubuntu) работает немного быстрее, чем pv, вероятно, из-за своего виртуального кольцевого буфера
Skaperen

@ Скаперен, я не знаю vbuf. Но, как кажется, в настоящий момент он нестабилен в Debian и поэтому часто недоступен на серверах, на которых обычно работает стабильная версия Debian.
Марко

58

rsync работает лучше всего для отображения прогресса во время процесса копирования.

например:

rsync -avh --progress sourceDirectory destinationDirectory

27

Как объяснено в других ответах, cp не предоставляет такую ​​функциональность. Тем не менее, progress (ранее назывался cv) - небольшой инструмент, который очень полезен для предоставления этой недостающей функции.

Этот инструмент можно описать как команду Tiny Dirty Linux Only * C, которая ищет базовые команды coreutils (cp, mv, dd, tar, gzip / gunzip, cat, ...), которые в настоящее время выполняются в вашей системе, и отображает процент скопированных данные.

Я использую его в течение последних нескольких месяцев, и это хорошо.


кажется, не работает со всеми файловыми системами (например, cifs), но +1, не знал таких сумасшедших выходов
akostadinov

1
Обратите внимание, что этот проект теперь называется «progress - Coreutils Progress Viewer (ранее известный как cv)».
chappjc

17

Можно ли увидеть скорость копирования и процент копий?

Да, можно отображать ход выполнения команды cpна терминале.


Способ № 1: (использовать progress)

Откройте новый терминал и введите progressего, чтобы отобразить ход выполнения cpкоманды и других команд, таких как:

cp, mv, dd, tar, cat, rsync, grep, fgrep, egrep, cut, sort, md5sum, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum, adb, gzip, gunzip, bzip2, bunzip2, xz, unxz, lzma, unlzma, 7z, zcat, bzcat, lzcat, split, gpg

Если вы не установили progress, вы можете установить его из репозитория, например , в CentOSэтой команде: yum -y install progress.

Затем, после запуска cpкоманды в фоновом режиме или после cpобычного запуска , откройте другой терминал, поэтому просто попробуйте эту команду:

# progress -m

Смотрите вывод:

[30904] cp /home/user/file.mp4
        2.3% (200.9 MiB / 8.4 GiB) 3.6 MiB/s remaining 0:38:58

Способ № 2: (используйте патч cp)

Или загрузите GNU coreutilsи исправьте его.

cd /tmp
wget http://ftp.gnu.org/gnu/coreutils/coreutils-8.21.tar.xz
tar -xvJf coreutils-8.21.tar.xz
cd coreutils-8.21
wget https://raw.githubusercontent.com/atdt/advcpmv/master/advcpmv-0.5-8.21.patch
patch -p1 -i advcpmv-0.5-8.21.patch

Бегать:

export FORCE_UNSAFE_CONFIGURE=1
./configure
make

Скопируйте два файла cpи mvloacated под coreutils-8.21/src/к /usr/local/bin:

cp src/cp /usr/local/bin/cp
cp src/mv /usr/local/bin/mv

Или скопируйте его, используя ваш файловый менеджер от имени root

Добавьте следующие строки в ваш ~/.bashrc:

alias cp='cp -gR'
alias mv='mv -g'

Выйти и Войти

Индикатор выполнения может отображаться без –gили –progress-barв соответствии с рекомендациями автора

Смотрите вывод:

0 files copied so far...                                              194.4 MiB /   8.4 GiB
[||--------------------------------------------------------------------------------]  2.3 %
Copying at   3.3 MiB/s (about 0h 5m 47s remaining)
/home/user/file.mp4                                                   194.4 MiB / 446.1 MiB
[||||||||||||||||||||||||||||||||||||----------------------------------------------] 43.6 %

Источник: linuxhelp


1
Это похоже на истинный источник cpпатча: web.archive.org/web/20131115171331/http://beatex.org/web/…
Kaushal Modi

1
+1 за подсказку о progressкоманде
Петр

это единственный реальный ответ
Алессио

14

Заметил, что это сообщение было несколько старым. Но когда я решил проблему, я решил опубликовать свое решение.

Сценарий: у нас очень большая структура каталогов, которую мы хотим скопировать, поэтому мы запускаем команду cp -R sourcedir destdir в одном окне терминала.

Откройте другое окно терминала или перенесите процесс в фоновый режим (Ctrl+Z,bg<CR>), а затем сделаем индикатор прогресса в гетто:

Сначала мы получаем общий размер структуры каталогов, которую мы хотим скопировать, вы делаете это с помощью:

du -sh /path/sourcedirectory/

Преобразуйте результат в гигабайты (G), затем замените n на результат, полученный в переменной sourcesize. После того, как вы вставили sourceize и destdir (каталог назначения), выполните команду ниже.

while true; do sourcesize=n destdir=/path/destinationdirectory/ copyprogress="$(export | du -sh $destdir | awk '{print $1}' | sed 's/[^0-9.]*//g' )" ; echo "scale=3 ; $copyprogress / $sourcesize * 100" | bc | xargs echo -n ; echo % completed ; sleep 10 ; done

Это будет печатать прогресс каждые 10 секунд с сообщениями, такими как:

0.100% completed
0.200% completed
0.300% completed 
... etc

Я знаю, что это решение не учитывает скорость копирования, но можно было бы добавить это, расширив приведенные выше команды, возможно превратив его в сценарий bash, чтобы его было легче читать. Например, проверяя, сколько данных копируется pr. В единицу времени скорость должна быть тривиальной для расчета и отображения.


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

Это замечательно, особенно в тех случаях, в которых я сейчас нахожусь: удаленно запустил огромное mv-задание для перемещения террабайтов резервных копий из одного пула хранения в другой, не задумываясь заранее о последствиях. Теперь я могу легко справиться с процессом и посмотреть на него. Потрясающие!
Райли

8

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

function cpstat () {

    tar -cf - "${@: 1: $#-1}" |
    pv -s "$( du -cs -BK --apparent-size "${@: 1: $#-1}" |
              tail -n 1 |
              cut -d "$(echo -e "\t")" -f 1)" |
    ( cd "${@: $#}"; tar -xf - )

;}



5

Даже если rsyncвы получите некоторую статистику прогресса, если вы хотите использовать индикатор выполнения, вы должны использовать pv.

Вы можете использовать cpvоболочку pvс более простым синтаксисом, более похожим на тот, cpкоторый вы можете использовать для рекурсивного копирования каталогов

введите описание изображения здесь

Вы можете получить это здесь


+1 за подсказку pv. Хорошая находка!
Питер

4

Использование такого инструмента, как mc(полночный командир), может быть хорошей альтернативой другим ответам.

Это простой файловый менеджер, который показывает вам процесс копирования / перемещения.



4

Другое простое решение - просто просмотреть выходную папку следующим образом:

Linux / Cygwin: watch -n 10 --differences du -sk --apparent-size <WATCHED_FOLDER>

FreeBSD: gnu-watch -n 10 --differences du -sk <WATCHED_FOLDER>

Эта удобная утилита будет работать duи выделять различия.

Еще одно потенциальное решение - написать простой сценарий, который зацикливает, вызывает duи выдает приблизительную оценку пропускной способности.


3

Этот инструмент представляет собой команду утилиты Linux, которая ищет основные команды coreutils (cp, mv, dd, tar, gzip / gunzip, cat и т. Д.), Которые в настоящее время выполняются в вашей системе, и отображает процент скопированных данных:

https://github.com/Xfennec/cv


1
Это уже было предложено @AmrMostafa в ноябре 14 года.
Дубу

2

У меня просто был случай, когда cp был более или менее заблокирован из-за ошибки FUSE в принимающей файловой системе.

Если вы не можете просто переключиться с cp (т. Е. Потому что --sparse = всегда) и хотите что-то действительно надежное для прогресса, перейдите через / proc.

Every 2.0s: cat /proc/20977/io                                                      Thu Sep 28 04:08:57 2017

rchar: 268573800
wchar: 268500992
syscr: 4112
syscw: 4097
read_bytes: 268697600
write_bytes: 0
cancelled_write_bytes: 0

0

VCP - копировать файлы в интерфейс curses (Показать индикатор выполнения в Linux).

ОПИСАНИЕ: vcp копирует файлы и каталоги в интерфейсе curses, с выводом только текста. его параметры и выходные данные похожи на cp BSD при добавлении некоторых новых функций.

Он предоставляет информацию о:

  • файлы скопированы и оставлены для копирования
  • записанные данные и общий размер данных
  • данные записываются каждую секунду
  • две строки состояния, одна показывает текущее состояние файла, другая - общее состояние (кроме одного файла, оба показывают текущий) и процент

когда вывод отправляется на консоль:

  • строка состояния
  • размер копируется и скорость

Страница руководства VCP: https://linux.die.net/man/1/vcp

Загрузите vcp-2.2.tar.gz с:

http://distfiles.gentoo.org/distfiles/vcp-2.2.tar.gz

Зависимость: curses.h (libncurses-dev).

В Ubuntu установите:

sudo apt-get install libncurses-dev

или же

sudo apt-get install libncurses5-dev

УСТАНОВИТЬ VCP:

make && make install

Руководство по эксплуатации:

man vcp
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.