При перемещении больших каталогов с помощью mv
, есть ли способ просмотреть прогресс (%)? У cp
команды на gentoo есть -g
переключатель, который показывает прогресс.
При перемещении больших каталогов с помощью mv
, есть ли способ просмотреть прогресс (%)? У cp
команды на gentoo есть -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, вы можете использовать простой псевдоним в своем файле точек оболочки:
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, поэтому он будет работать повсюду.
bar
еще не завернут mv
.
rsync
это не полностью заменяет mv
(о чем спрашивает OP), особенно когда речь идет о быстрых копиях в таких файловых системах, как копирование при записи 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, то это также даст вам прогресс.
Если ваша цель - переместить / скопировать каталог с индикатором выполнения, но избегая нетерминального графического интерфейса пользователя, 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
(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/
Прежде всего: я никогда не копирую большие файлы без использования ionice, если не знаю, что не захочу использовать компьютер полчаса или больше.
Второе: все мои разделы разделены, поэтому копирование внутри раздела не занимает много времени. Если это длинная копия, я делаю du -sm
на файлы и df -m | grep copy_to_partition
. Затем, если мне интересно, сколько еще времени потребуется, я делаю еще df
раз и вижу, сколько файлов было скопировано.
На моем Mint мне нравится использовать 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
Это просто напечатает размер каталога, чтобы вы могли увидеть, сколько данных было скопировано, или вы можете запустить его пару раз, чтобы увидеть, как быстро передаются данные.