Як я можу переміщувати файли та переглядати хід (наприклад, за допомогою панелі прогресу)?


118

Під час переміщення великих каталогів mv, чи існує спосіб перегляду прогресу (%)? cpКоманда на Хинду був -gперемикач , який показав прогрес.


3
Вимірювання пропускної здатності труби в оболонці може допомогти, хоча я не знаю, чи можна легко використовувати ці інструменти під час переміщення файлу
Michael Mrozek

Відповіді:


50

Ви можете створити патч-cp та mv, які потім обидва підтримують перемикач -g, щоб показати прогрес. На цій сторінці є інструкції та виправлення . Однак : сторінка доручає вам це робити

$ sudo cp src/cp /usr/bin/cp
$ sudo cp src/mv /usr/bin/mv

який перезаписує оригінальний cp та mv. У цього є два недоліки: По-перше, якщо оновлений пакет coreutils надходить у вашу систему, вони будуть перезаписані. По-друге, якщо з виправленою версією є проблема, вони можуть порушити скрипти, спираючись на стандартні cp та mv. Я б краще зробив щось подібне:

$ sudo cp src/cp /usr/local/bin/cpg
$ sudo cp src/mv /usr/local/bin/mvg

який копіює файли в / usr / local / bin, який призначений для компільованих користувачами програм, і дає їм іншу назву. Отже, коли ви хочете, щоб пробіг прогресу, ви говорите mvg -g bigfile /mnt/backupта використовуєте mv нормально.

Також ви можете зробити це, alias mvg="/usr/local/mvg -g"вам потрібно лише сказати mvg bigfile /mnt/backupі безпосередньо отримати панель прогресу.


2
На жаль, виправлення на "цій сторінці" більше немає, і, здається, не було індексовано у веб-архіві. Здається, є багато патчів з подібним назвою та функцією , чи можете ви відредагувати свою відповідь, щоб уточнити, який з них ви мали на увазі?
Жиль

Я думаю, що github.com/atdt/advcpmv є дійсним наступником, і він має той самий патч, тому я змінив посилання, щоб вказати на нього.
fschmitt

93

Мені не подобається ідея перезаписувати бінарні файли з coreutil, коли є більш прості рішення, тож ось моє:

rsync : Rsync копіює файли та має -Pперемикач панелі прогресу. Отже, якщо у вас встановлено rsync, ви можете використовувати простий псевдонім у вашому dotfile оболонок:

alias cp='rsync -aP'

Мінус у тому, що rsync трохи повільніше, ніж cp, але ви повинні виміряти це часом і вирішити для себе, я можу з цим жити :-)

Сценарій оболонки : Сценарій оболонки також може створити панель прогресу. Я знайшов це деякий час тому в мережі, і не пам’ятаю джерела:

#!/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% [===============================>                      ]

бар :

'bar' - 'cat' з панеллю прогресу ASCII

barце невеликий скрипт оболонки для відображення панелі процесів для всіх видів операцій (cp, tar тощо). Ви можете знайти приклади на домашній сторінці проекту.

Її також написано для оболонки бурна, тому вона буде бігати поблизу скрізь.


3
barще не загортається mv.
Тобу

5
Кредит на скрипт
Lamnk

1
Зауважте, що rsyncце не замінює повністю mv(запитує ОП) повністю, особливо якщо мова йде про швидкі копії в файлових системах копіювання під час запису, як-от btrfs.
Карл Ріхтер

74

Існує новий інструмент під назвою, progressякий може знайти будь-який дескриптор, пов’язаний із запущеною командою, і показує хід та швидкість: тут доступний

progress -w

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


3
WOW, я не очікував, що це буде так приголомшливо! Я просто набрав progressпісля встановлення, і це дало мені прогрес для mvкоманди, яку я на даний момент чекав. Дякую!
jredd

3
Дякую! Під час переміщення матеріалів як кореня здається, що вам доведеться використовувати sudo(я думаю, той самий користувач) - ви також watchможете сказати, що відбувається кожні 2 секунди:watch progress -w
Вільф

6
Чудова програма, але при переміщенні, наприклад, папки з багатьма файлами, вона показує лише хід поточного файлу, а не всієї папки в цілому. Замість watch progress -wвас також можна просто використовуватиprogress -m
mxmlnkn

6
ІМХО, це найбільш єдиний спосіб вирішення проблеми. Замість того, щоб виправляти coreutils або використовувати інструменти, які не призначені для конкретних цілей (наприклад, rsync для mv) або писати скрипти для перекручування, просто використовуйте цей інструмент, написаний для предметної мети з любов'ю.
Горе

34

Ви можете використовувати команду перегляду труб,pv щоб показати панель виконання:

pv /original/file > /new/file

Я часто використовую це для копіювання великого файлу через змонтовану мережеву файлову систему (поєднуються з gzipта tar). Недоліком є ​​те, що ви можете скопіювати лише один файл, а не каталог. І ви повинні дати ім'я новому файлу, ви не можете просто дати каталог призначення, як cpце робиться. Однак копіювання не pvє метою. Це потужний інструмент і робить набагато більше, ніж просто копіювати файл. Дивіться домашню сторінку, щоб отримати більше прикладів pv.

Набагато кращий варіант - використовувати rsync -aP. Якщо ви хочете mvзамість цього, додайте прапор --remove-source-files. Додайте це до свого, .bashrcякщо ви хочете часто використовувати команди:

alias rscp='rsync -aP'
alias rsmv='rsync -aP --remove-source-files'

Мінус тут rsync показує лише прогрес, а не смужку прогресу.


tar cf - source-dir | pv | tar xf - -C out-dirдасть вам пропускну здатність цілого каталогу. Якщо ви знаєте розмір і переходите -sдо pv, це може дати вам і прогрес.
аранцій

6

Якщо ваша мета - перемістити / скопіювати каталог з панеллю прогресу, але уникати нетермінального GUI, mc (Midnight Commander) - хороший вибір.


3

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

Ось як я переміщу каталог із rsync зі звітом про хід:

rsync -aP --remove-source-files $src $dst && rm -r $src

Переконайтеся , що $srcнічого НЕ закінчується зворотною косою межею, в іншому випадку ви отримаєте інше значення , ніж в GNU cp.

rm -rЗрештою , це необхідно , тому що --remove-source-filesтільки видаляє вихідні файли, після того, як кожен з них успішно скопійований, а НЕ каталоги. &&Переконується , щоб запустити його , тільки якщо Rsync успішно завершується. Якщо ви параноїк, ви можете замінити його на якийсь рекурсивний rmdir, наприкладfind $src -d -exec rmdir {} +

Єдиний глюк полягає в тому, що -Pпараметр показує прогрес для кожного файлу, а не для всієї операції копіювання. Це може бути марним, якщо ви намагаєтеся перемістити каталог з багатьма крихітними файлами. В останній версії розробки rsync є альтернативний прапор, --info=progress2який показує прогрес у всій операції.


2

Щоб уникнути виправлення Coreutil, щоб додати панель прогресу до mvта cp, gcp(Coffer Goffi) є новою альтернативою: http://wiki.goffi.org/wiki/Gcp/en

Використовувати так само, як cpі -rдля варіантів рекурсивності та -vбагатослівності.

Він використовує чергу файлів, коли паралельно викликаються кілька команд. Він також дозволяє записувати скопійовані імена файлів в журнал, см Джерело збереження людини Сторінка розділ для деталей.

Ось хороший підручник для початку роботи gcp: http://mylinuxbook.com/gcp-advanced-command-line-file-copier-inspired-by-cp/


Чи є gmv, як gcp для cp?
CodyChan

Я не знайшов еквівалента. До речі, немає необхідності в панелі прогресу при запуску "mv" в єдиній файловій системі ... це досить швидко. Якщо переміщення здійснюється через дві різні файлові системи, він реалізується у вигляді cp, а потім видалити джерело, якщо вдасться, або видалити ціль, якщо не вдалося. Простий скрипт оболонки на основі gcp може зробити це належним чином (за допомогою першої перевірки, щоб дізнатися, чи джерело та ціль справді є в різних файлових системах)
Ів Мартін,

2

По-перше: я ніколи не копіюю великі файли без використання ionice, якщо тільки не знаю, що не захочу користуватися комп’ютером півгодини і більше.

По-друге: всі мої розділи є юранними, тому внутрішньороздільне копіювання не потребує часу. Якщо це довга копія, я роблю du -smна файли і df -m | grep copy_to_partition. Тоді, якщо цікаво, скільки ще часу знадобиться, я dfповторюсь і побачу, скільки файлів було скопійовано.


Чи хотіли б ви поділитися своїми порадами щодо йоніків? який пріоритет ви б надали mv cpu-mud та дисковому вводу-виводу? Ось мої налаштування, але завантаження процесора все ще залишається високим навіть після відмови
ychaouche

2

На моєму монетному дворі я люблю використовувати gcp для цього або curl-рішення (що дуже добре)

gcp SOURCE DESTINATION

Можливо, вам доведеться встановити його sudo apt-get install gcp

І дуже приємне та відмінне завдання для панелі прогресу з інформацією про

  • % Всього
  • % Отримано
  • % Xferd
  • Середній DL
  • Швидкість завантаження
  • Час залишився
  • Витрачений час
  • Час загальний
  • Поточна швидкість

у приємному для читання форматі:

curl -o DESTINATION FILE://source

Також вам може знадобитися встановити його спочатку sudo apt-get install curl


gcpне підтримує переміщення файлу, тобто вихідні файли повинні бути видалені вручну після успішного копіювання.
Карл Ріхтер

2

Це не дає вам смужки прогресу, але натисніть, CTRL-Tі ви надішлете SIGINFOдо нього mv, який повідомить, над яким файлом він працює і наскільки далеко йде процес. Це досить зручно, щоб це було для великих передач файлів, можливо, не так корисно для передачі з багатьма невеликими файлами.

Короткий приклад:

mv 135/61 /Volumes/Jules/135/
# hit C-t
load: 1.08  cmd: cp 35470 uninterruptible 0.00u 0.04s
135/61/1/1-s2.0-S006738-main.pdf -> /Volumes/Jules/135/61/1/1-s2.0-S006738-main.pdf  68%

1
Це не спрацювало для мене: я зрозумів, INFO: unknown signal; killall -l lists signals. що SIGINFO є лише на деяких BSD, а не в стандартних POSIX.
Брайан Мінтон

2
Правильно. Це працює в Mac OS X, але, швидше за все, не в, скажімо, Ubuntu.
Чарльз

1

Використовується mv -vдля друку одного рядка на переміщений файл та pv -lдля друку прогресу на основі кількості рядків (фактично кількість файлів).

Вам знадобиться pv(переглядач труб): http://www.ivarch.com/programs/pv.shtml

mv -v sourcedir targetdir | pv -l -s filecount > logfile

Використовуйте таку команду, щоб отримати кількість файлів:

find sourcedir | wc -l

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

Зауважте, що mvна одному і тому ж розділі має бути швидко. mvдо іншого розділу буде таким самим, як і cp source targetдалі rm source. Отже, ось дві команди для копіювання каталогів з інформацією про хід.

звітувати про прогрес на основі кількості скопійованих файлів:

cp -av sourcedir targetdir | pv -l -s filecount > logfile

звітувати про хід на основі скопійованих байтів:

tar c sourcedir | pv -s size | tar x -C targetdir

Дивіться тут для отримання більш детальної інформації: про хід інформації через pv для копіювання каталогу


1

Незмінно я закінчую пошук цієї відповіді після того, як запускаю команду 'mv', і тоді я не хочу запускати її знову. Якщо ви знаходитесь у цій ситуації, дуже простий спосіб контролювати прогрес (або побачити, чи достатньо далеко, щоб його не варто вбивати):

du -hs /directory/you're/moving/data/to

Це просто надрукує розмір каталогу, щоб ви могли побачити, скільки даних було скопійовано, або ви можете запустити їх кілька разів, щоб побачити, як швидко передаються дані.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.