Как я могу перемещать файлы и просматривать прогресс (например, с помощью индикатора выполнения)?

118

При перемещении больших каталогов с помощью mv, есть ли способ просмотреть прогресс (%)? У cpкоманды на gentoo есть -gпереключатель, который показывает прогресс.

letronje
источник
3
Измерение пропускной способности канала в оболочке может помочь, хотя я не знаю, возможно ли легко использовать эти инструменты при перемещении файла
Майкл Мрозек

Ответы:

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и сразу получить индикатор выполнения.

fschmitt
источник
2
К сожалению, патч на «этой странице» больше не присутствует и, похоже, не был проиндексирован в веб-архиве. Похоже, что есть много патчей с похожими названиями и функциями. Можете ли вы отредактировать свой ответ, чтобы уточнить, какой из них вы имели в виду?
Жиль
Я думаю, что github.com/atdt/advcpmv является действующим преемником, и у него тот же патч, поэтому я изменил ссылку, чтобы указать на него.
fschmitt
93

Мне не нравится идея перезаписывать двоичные файлы из coreutil, когда есть более простые решения, так что вот мое:

rsync : Rsync копирует файлы и имеет -Pпереключатель для индикатора выполнения. Так что, если у вас установлен rsync, вы можете использовать простой псевдоним в своем файле точек оболочки:

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 и т. д.) Вы можете найти примеры на домашней странице проекта.

Он также написан для оболочки Bourne, поэтому он будет работать повсюду.

echox
источник
3
barеще не завернут mv.
Тобу
5
Кредит на сценарий оболочки
Lamnk
1
Обратите внимание, что rsyncэто не полностью заменяет mv(о чем спрашивает OP), особенно когда речь идет о быстрых копиях в таких файловых системах, как копирование при записи btrfs.
Карл Рихтер
74

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

progress -w

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

naugtur
источник
3
ВАУ, я не ожидал, что это будет так здорово! Я просто набрал progressпосле установки, и он представил мне прогресс для mvкоманды, которую я ждал в настоящее время. Спасибо!
Jredd
3
Спасибо! Когда вы перемещаете вещи как root, вам кажется, что вы должны использовать sudo(тот же пользователь, я думаю) - вы также можете использовать, watchчтобы сказать, что происходит каждые 2 секунды:watch progress -w
Wilf
6
Потрясающая программа, но при перемещении, например, папки с большим количеством файлов, она показывает только прогресс текущего файла, а не всю папку в целом. Вместо watch progress -wвас также можно просто использоватьprogress -m
mxmlnkn
6
ИМХО, это самый unix-способ решения проблемы. Вместо того, чтобы исправлять 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 показывает только прогресс, а не индикатор выполнения.

Lamnk
источник
tar cf - source-dir | pv | tar xf - -C out-dirдаст вам пропускную способность всего каталога. Если вы знаете размер и перейдете -sв pv, то это также даст вам прогресс.
Арантий
6

Если ваша цель - переместить / скопировать каталог с индикатором выполнения, но избегая нетерминального графического интерфейса пользователя, 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(Goffi's CoPier) - это новая альтернатива: 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, может сделать это правильно (с первой проверкой, чтобы узнать, действительно ли источник и цель на разных файловых системах)
Yves Martin
2

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

Второе: все мои разделы разделены, поэтому копирование внутри раздела не занимает много времени. Если это длинная копия, я делаю du -smна файлы и df -m | grep copy_to_partition. Затем, если мне интересно, сколько еще времени потребуется, я делаю еще dfраз и вижу, сколько файлов было скопировано.

HandyGandy
источник
Не могли бы вы поделиться своими советами? какой приоритет вы бы дали mv cpu-мудрый и дисковый ввод-вывод? Вот мои настройки, но загрузка процессора все еще остается высокой даже после обновления: imgur.com/a/DLMJplz
ychaouche
2

На моем Mint мне нравится использовать gcp для этого или curl-решения (что действительно приятно)

gcp SOURCE DESTINATION

Возможно, вам придется установить его sudo apt-get install gcp

И очень хорошая и отличная задача для индикатора выполнения с информацией о

  • % Общее количество
  • % Получил
  • % Xferd
  • Средний DL
  • Скорость загрузки
  • Время вышло
  • Время проведено
  • Общее время
  • Текущая скорость

в хорошем читаемом формате это:

curl -o DESTINATION FILE://source

Кроме того, вам может понадобиться сначала установить его sudo apt-get install curl

ThePentadactyl
источник
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 для копирования каталога

lesmana
источник
1

Неизменно я в конечном итоге ищу этот ответ после того, как я запускаю команду «mv», и в этот момент я не хочу запускать его снова. Если вы находитесь в этой ситуации, очень простой способ отслеживать прогресс (или посмотреть, достаточно ли он далеко, чтобы его не стоило убивать) - запустить:

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

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

qazmonk
источник