Під час переміщення великих каталогів 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
Це просто надрукує розмір каталогу, щоб ви могли побачити, скільки даних було скопійовано, або ви можете запустити їх кілька разів, щоб побачити, як швидко передаються дані.