Під час переміщення великих каталогів mv
, чи існує спосіб перегляду прогресу (%)? cp
Команда на Хинду був -g
перемикач , який показав прогрес.
Під час переміщення великих каталогів mv
, чи існує спосіб перегляду прогресу (%)? cp
Команда на Хинду був -g
перемикач , який показав прогрес.
Відповіді:
Ви можете створити патч-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
і безпосередньо отримати панель прогресу.
Мені не подобається ідея перезаписувати бінарні файли з 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 тощо). Ви можете знайти приклади на домашній сторінці проекту.
Її також написано для оболонки бурна, тому вона буде бігати поблизу скрізь.
bar
ще не загортається mv
.
rsync
це не замінює повністю mv
(запитує ОП) повністю, особливо якщо мова йде про швидкі копії в файлових системах копіювання під час запису, як-от btrfs
.
Існує новий інструмент під назвою, progress
який може знайти будь-який дескриптор, пов’язаний із запущеною командою, і показує хід та швидкість:
тут доступний
progress -w
виводить статистику для всіх запущених операцій cp, mv тощо
progress
після встановлення, і це дало мені прогрес для mv
команди, яку я на даний момент чекав. Дякую!
sudo
(я думаю, той самий користувач) - ви також watch
можете сказати, що відбувається кожні 2 секунди:watch progress -w
watch progress -w
вас також можна просто використовуватиprogress -m
Ви можете використовувати команду перегляду труб,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, це може дати вам і прогрес.
Якщо ваша мета - перемістити / скопіювати каталог з панеллю прогресу, але уникати нетермінального GUI, mc (Midnight Commander) - хороший вибір.
Моє рішення - використовувати 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
який показує прогрес у всій операції.
Щоб уникнути виправлення 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/
По-перше: я ніколи не копіюю великі файли без використання ionice, якщо тільки не знаю, що не захочу користуватися комп’ютером півгодини і більше.
По-друге: всі мої розділи є юранними, тому внутрішньороздільне копіювання не потребує часу. Якщо це довга копія, я роблю du -sm
на файли і df -m | grep copy_to_partition
. Тоді, якщо цікаво, скільки ще часу знадобиться, я df
повторюсь і побачу, скільки файлів було скопійовано.
На моєму монетному дворі я люблю використовувати gcp для цього або curl-рішення (що дуже добре)
gcp SOURCE DESTINATION
Можливо, вам доведеться встановити його sudo apt-get install gcp
І дуже приємне та відмінне завдання для панелі прогресу з інформацією про
у приємному для читання форматі:
curl -o DESTINATION FILE://source
Також вам може знадобитися встановити його спочатку sudo apt-get install curl
gcp
не підтримує переміщення файлу, тобто вихідні файли повинні бути видалені вручну після успішного копіювання.
Це не дає вам смужки прогресу, але натисніть, 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%
INFO: unknown signal; killall -l lists signals.
що SIGINFO є лише на деяких BSD, а не в стандартних POSIX.
Використовується 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 для копіювання каталогу
Незмінно я закінчую пошук цієї відповіді після того, як запускаю команду 'mv', і тоді я не хочу запускати її знову. Якщо ви знаходитесь у цій ситуації, дуже простий спосіб контролювати прогрес (або побачити, чи достатньо далеко, щоб його не варто вбивати):
du -hs /directory/you're/moving/data/to
Це просто надрукує розмір каталогу, щоб ви могли побачити, скільки даних було скопійовано, або ви можете запустити їх кілька разів, щоб побачити, як швидко передаються дані.