Вопрос или проблема
При перемещении больших каталогов с помощью mv
, существует ли способ посмотреть прогресс (%)?
Команда cp
на gentoo имела переключатель -g
, который показывал прогресс.
Есть новый инструмент, называемый progress
, который может находить любой дескриптор, связанный с выполняемой командой, и показывать прогресс и скорость:
доступно здесь
progress -w
выводит статистику для всех выполняющихся операций cp,mv и т.д.
Мне не нравится идея перезаписывать бинарные файлы из coreutil, когда есть более простые решения, поэтому вот мои:
rsync: Rsync копирует файлы и имеет переключатель -P
для отображения прогресса. Так что если у вас установлен rsync, вы можете использовать простой псевдоним в вашем dotfile оболочки:
alias cp='rsync -aP'
Недостаток в том, что rsync немного медленнее, чем cp, но вы должны измерить это с помощью времени и решить для себя, я могу мириться с этим 🙂
Shell Script: Скрипт оболочки также может создать индикатор прогресса. Я нашел это некоторое время назад в интернете и не помню источник:
#!/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:
‘bar’ – ‘cat’ с ASCII индикатором прогресса
bar
– это небольшой скрипт оболочки для отображения индикатора прогресса для всех видов операций (cp, tar и т.д.). Вы можете найти примеры на странице проекта.
Он также написан для оболочки bourne, поэтому он будет работать практически везде.
Вы можете создать исправленный 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
и сразу получить индикатор прогресса.
Вы можете использовать команду pipe viewer 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 показывает только прогресс, а не индикатор прогресса.
Если ваша цель – переместить/скопировать каталог с индикатором прогресса, но избегая графического интерфейса, 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
, который показывает прогресс для всей операции.
Это не дает вам индикатор прогресса, но, нажав CTRL-T
, вы отправите SIGINFO
в mv
, который сообщит, над каким файлом он работает и насколько он продвинулся в процессе. Это может быть удобно при больших перемещениях файлов, но может быть не столь полезно для переноса с множеством маленьких файлов.
Краткий пример:
mv 135/61 /Volumes/Jules/135/
# нажмите 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%
mv -v sourcedir targetdir | pv -l -s filecount > logfile
Вам понадобится pv
(pipe viewer): http://www.ivarch.com/programs/pv.shtml
mv -v
будет выводить по одной строке на каждый перемещенный файл, а pv -l
будет сообщать о прогрессе на основе подсчета строк.
вы можете получить количество файлов следующим образом:
find sourcedir | wc -l
Команда выше покажет информацию о прогрессе на основе количества скопированных файлов. Это лучше всего работает, если файлов много и они небольшие. Если файлов всего несколько, и они огромные, это будет мало интересно.
Для получения других альтернатив, включая методы, которые могут сообщать о прогрессе на основе размера, см. здесь: информация о прогрессе с помощью pv для копирования каталога
Все описанные там методы копируют файлы вместо перемещения. Но если вы перемещаете не в пределах одной файловой системы, перемещение – это фактически копирование, за которым следует удаление.
Я неизменно снова ищу это решение после того, как запускаю команду ‘mv’, в какой-то момент я не хочу начинать ее заново. Если вы находитесь в этой ситуации, очень простой способ контролировать прогресс (или узнать, насколько далеко он продвинулся, чтобы не стоило его останавливать) – это запустить:
du -hs /directory/you're/moving/data/to
Это просто напечатает размер каталога, чтобы вы могли увидеть, сколько данных было скопировано, или вы можете запустить его несколько раз, чтобы увидеть, с какой скоростью данные переносятся.
Я использую следующий скрипт, сохраненный под именем rsmv
:
#!/usr/bin/env bash
rsync -aP --remove-source-files "$@" && rm -rf "${@:1:$#-1}"
Он обрабатывает более чем один источник и имена файлов с пробелами:
$ rsmv source1 source2 source\ 3 "source 4" dest
Чтобы избежать патча coreutil для добавления индикатора прогресса в mv
и cp
, gcp
(Goffi’s CoPier) – это новая альтернатива: http://wiki.goffi.org/wiki/Gcp/en
Используйте его так же, как cp
с опциями -r
для рекурсивного поиска и -v
для подробного вывода.
Он использует очередь файлов, когда несколько команд вызываются одновременно. Это также позволяет записывать имена скопированных файлов в журнал, см. раздел man Source saving для получения подробной информации.
Вот хороший учебник, чтобы начать использовать gcp
: http://mylinuxbook.com/gcp-advanced-command-line-file-copier-inspired-by-cp/
На моей системе Mint мне нравится использовать gcp или curl-решение (которое действительно приятно)
gcp SOURCE DESTINATION
Возможно, вам нужно будет установить его sudo apt-get install gcp
И очень хорошая и отличная задача для индикатора прогресса с информацией о
- % Total
- % Received
- % Xferd
- Average DL
- Speed Upload
- Time left
- Time spent
- Time total
- Current Speed
в хорошо читаемом формате:
curl -o DESTINATION FILE://source
Также, возможно, вам нужно будет сначала его установить sudo apt-get install curl
Во-первых: я никогда не копирую большие файлы без использования ionice, если не знаю, что мне не нужно будет использовать компьютер в течение получаса или более.
Во-вторых: все мои разделы журнальные, поэтому копирование внутри раздела не занимает много времени. Если это долгое копирование, я делаю du -sm
на файлах и df -m | grep copy_to_partition
. Тогда, если интересно, сколько времени это еще займет, я делаю df
снова и смотрю, сколько файлов было скопировано.
На Mac вы можете открыть Мониторинг Системы и перейти на вкладку Disk, найти процесс ‘mv’ в списке и посмотреть на ‘Bytes Written’. Это показывает, насколько далеко продвинулся перенос.
Это не точное решение, но оно дает вам уверенность в том, что ваш перенос работает и вы можете видеть приблизительную скорость.
.
Ответ или решение
Перемещение и копирование файлов в операционной системе Linux традиционно осуществляется с использованием команды mv
для перемещения и cp
для копирования. Однако стандартные версии этих утилит не предоставляют встроенных индикаторов прогресса, что может затруднить отслеживание процесса при работе с большими объемами данных. Вопрос: "Как можно отобразить прогресс (%) при перемещении больших директорий с помощью mv
?" является актуальным для многих пользователей, сталкивающихся с этим вызовом в своей практике. В этой статье рассмотрим несколько способов вовлечения индикаторов прогресса при перемещении файлов в Linux.
Теория: Почему отслеживание прогресса важно
Отслеживание прогресса при перемещении файлов позволяет пользователю оценивать время, необходимое для завершения операции, и принимать решения на основе текущего состояния процесса, такие как пауза, прерывание или корректировка стратегии. Это особенно важно в корпоративной среде, где время и ресурсы имеют критическое значение. Без визуального индикатора или детализации процесса пользователи могут сталкиваться с неопределенностью и неэффективностью.
Примеры: Как реализовать отображение прогресса
-
Использование
rsync
: Это мощная утилита, которая предоставляет множество возможностей для копирования и синхронизации файлов. Включая опции-a
(архивный режим) и-P
(отображение прогресса), вы можете эффективно копировать и перемещать файлы:rsync -aP --remove-source-files источник_папка/ папка_назначения/
Здесь опция
--remove-source-files
служит для удаления файлов с исходной стороны после их успешного копирования, тем самым имитируя поведениеmv
. -
Программа
progress
: Это утилита, которая может отслеживать файлы, перемещаемые другими процессами, такими какmv
иcp
, и отображать прогресс:progress -w
Она выводит статистику для всех запущенных операций, связанных с перемещением и копированием файлов.
-
Использование
pv
(Pipe Viewer): Хотя эта утилита изначально не предназначена для перемещения файлов, она может быть полезной для отслеживания большого числа однофайловых операций.mv -v источник_файл назначение_файл | pv -l -s $(find источник_файлы -type f | wc -l)
Здесь
pv
выступает в роли мониторинга на основе количества строк, передаваемых через конвейер. -
Самодельные скрипты на Shell: Пользователи также могут создавать свои скрипты на Shell для добавления функциональности отображения прогресса в процессе копирования файлов. Вот пример простого скрипта:
#!/bin/sh cp_p() { strace -q -ewrite cp -- "${1}" "${2}" 2>&1 \ | awk '{ ... END { print "" }' total_size=$(stat -c '%s' "${1}") count=0 }
-
Использование утилиты
gcp
: Это улучшенная версияcp
, которая поддерживает уведомления о прогрессе и логирование. Она, как правило, не входит в стандартные репозитории, поэтому может потребоваться её установка.
Применение: Как выбрать подходящую стратегию
При выборе подходящей стратегии важно учитывать масштабы операции, среду (локальная или сетевая), а также возможность установки дополнительных программ и утилит в вашей системе. Например, если у вас есть возможность установить дополнительные пакеты, rsync
с флагом прогресса может стать отличным выбором для перемещения больших директорий.
Для более простых случаев, когда требуется минимально вмешиваться в систему, использование progress
может быть весьма подходящим решением. Также стоит учитывать использование самописных скриптов на Shell, чтобы полностью оптимизировать процесс под ваши нужды.
Заключение
Тема отслеживания прогресса перемещения и копирования файлов в Linux предлагает множество решений, каждое из которых обладает своими преимуществами и недостатками. Важно проанализировать свои потребности и ограниченные ресурсы системы перед тем, как выбрать наилучший подход для осуществления данных операций. С использованием вышеупомянутых инструментов и стратегий вы сможете оптимизировать работу с файлами и подойти к этому вопросу с позиции комфорта и эффективности.