Чи можна побачити швидкість cp та скопійовані відсотки?


251

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


39
Ви можете використовувати rsyncзамість цього cp. У неї є --progressваріант.
frostschutz

2
Midnight Commanderтакож добре працює і має досить текстовий інтерфейс із смужками прогресу, але може бути не встановлений. Спробуйте mcв командному рядку. Також, очевидно, це не так cp.
CVn

3
Використання rsyncз --progressщойно змусило мене зрозуміти, що відбувається. Він застрягає, коли досягає 100%, а потім триває пару хвилин в кінці. Я думаю, це те саме, що відбувається з nautilus. У будь-якому випадку це вже інше питання, тому найкращою відповіддю на це питання є rsync --progress: він показує розмір,%, швидкість та минулий час.
yzT

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

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

Відповіді:


193

rsyncмає прапор, progress2який називається загальним відсотком:

rsync --info=progress2 source dest

5
--info = progress2 досі не перетворив його у сховище за замовчуванням, і ось це 2015 рік. Здається, це гарна ідея.
Lonniebiz

1
--info=progress2нарешті включено о version 3.1.0 protocol version 31. Можливо, ви могли б відредагувати свою відповідь, yzT.
Sopalajo de Arrierez

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

@Skaperen Я не знаю vbuf. Але, як здається, в Debian він наразі нестабільний і тому часто недоступний на серверах, які зазвичай працюють на стабільній Debian.
Марко

58

rsync найкраще показує прогрес під час копіювання.

колишній:

rsync -avh --progress sourceDirectory destinationDirectory

27

Як пояснено в інших відповідях, cp не забезпечує цю функціональність. Однак прогрес (який раніше називався cv) - це невеликий інструмент, який дуже допомагає забезпечити цю відсутність функції.

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

Я використовую його протягом останніх кількох місяців, і це солідно.


не працює з усіма файловими системами (наприклад, cifs), але +1, не знав таких шалених виходів
akostadinov

1
Зауважте, що цей проект зараз називається "прогрес - Coreutils Progress Viewer (раніше відомий як cv)".
chappjc

17

Чи можна побачити швидкість cp та скопійовані відсотки?

Так, можна відобразити хід виконання команди 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та mvперейдіть 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/…
Каушал Моді

1
+1 для підказки про progressкомандування
Петро

це єдина реальна відповідь
Алессіо

14

Помітили, що ця публікація була дещо старою. Але коли я вирішив вирішити це питання, я подумав, що опублікую своє рішення.

Сценарій: У нас дуже велика структура каталогів, яку ми хочемо скопіювати, тому ми видаємо команду cp -R sourcedir destdir в одному вікні терміналу.

Відкрийте інше вікно терміналу або відсуньте процес на другий план (Ctrl+Z,bg<CR>), тоді давайте зробимо індикатор прогресу способом гетто:

Ми спочатку отримуємо загальний розмір структури каталогів, яку ми хочемо скопіювати, ви робите це за допомогою:

du -sh /path/sourcedirectory/

Перетворіть результат у гігабайти (G), а потім замініть n на результат, який ви отримали у змінному sourceize. Після того, як ви вставили 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. n одиниці часу, швидкість повинна бути тривіальною для обчислення та відображення.


Це насправді ідеально для мого використання, тому дякую за публікацію! Я хочу знати про хід копіювання величезного каталогу з тисячами файлів, а не лише одним файлом, тому інші рішення мені не дуже допомагають.
Ібрагім

Це чудово, особливо у таких випадках, як я зараз переживаю: Віддалено розпочав величезну 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 - )

;}

6

Не в стандартній версії cp.

Ви можете фон cp та перелічити розмір, очікуючи cpзакінчення.

Я використовую цей Perl для моніторингу росту одного файлу, але він працює зовнішньо до cp (або що ще я роблю)



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, доступний лише текст. його параметри та вихід схожі з процесором BSD, додаючи нові функції.

Він надає інформацію про:

  • файли скопійовано та залишено для копіювання
  • записані дані та загальний розмір даних
  • дані записуються щосекунди
  • два рядки стану, на одному відображається поточний статус файлу, інший загальний статус (крім 1 файлу, обидва показують поточний) та відсоток

коли вихід надсилається на консоль:

  • рядок стану
  • розмір скопійовано та швидкість

Довідкова сторінка 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.