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

Вопрос или проблема

При перемещении больших каталогов с помощью 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.

Теория: Почему отслеживание прогресса важно

Отслеживание прогресса при перемещении файлов позволяет пользователю оценивать время, необходимое для завершения операции, и принимать решения на основе текущего состояния процесса, такие как пауза, прерывание или корректировка стратегии. Это особенно важно в корпоративной среде, где время и ресурсы имеют критическое значение. Без визуального индикатора или детализации процесса пользователи могут сталкиваться с неопределенностью и неэффективностью.

Примеры: Как реализовать отображение прогресса

  1. Использование rsync: Это мощная утилита, которая предоставляет множество возможностей для копирования и синхронизации файлов. Включая опции -a (архивный режим) и -P (отображение прогресса), вы можете эффективно копировать и перемещать файлы:

    rsync -aP --remove-source-files источник_папка/ папка_назначения/

    Здесь опция --remove-source-files служит для удаления файлов с исходной стороны после их успешного копирования, тем самым имитируя поведение mv.

  2. Программа progress: Это утилита, которая может отслеживать файлы, перемещаемые другими процессами, такими как mv и cp, и отображать прогресс:

    progress -w

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

  3. Использование pv (Pipe Viewer): Хотя эта утилита изначально не предназначена для перемещения файлов, она может быть полезной для отслеживания большого числа однофайловых операций.

    mv -v источник_файл назначение_файл | pv -l -s $(find источник_файлы -type f | wc -l)

    Здесь pv выступает в роли мониторинга на основе количества строк, передаваемых через конвейер.

  4. Самодельные скрипты на 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
    }
  5. Использование утилиты gcp: Это улучшенная версия cp, которая поддерживает уведомления о прогрессе и логирование. Она, как правило, не входит в стандартные репозитории, поэтому может потребоваться её установка.

Применение: Как выбрать подходящую стратегию

При выборе подходящей стратегии важно учитывать масштабы операции, среду (локальная или сетевая), а также возможность установки дополнительных программ и утилит в вашей системе. Например, если у вас есть возможность установить дополнительные пакеты, rsync с флагом прогресса может стать отличным выбором для перемещения больших директорий.

Для более простых случаев, когда требуется минимально вмешиваться в систему, использование progress может быть весьма подходящим решением. Также стоит учитывать использование самописных скриптов на Shell, чтобы полностью оптимизировать процесс под ваши нужды.

Заключение

Тема отслеживания прогресса перемещения и копирования файлов в Linux предлагает множество решений, каждое из которых обладает своими преимуществами и недостатками. Важно проанализировать свои потребности и ограниченные ресурсы системы перед тем, как выбрать наилучший подход для осуществления данных операций. С использованием вышеупомянутых инструментов и стратегий вы сможете оптимизировать работу с файлами и подойти к этому вопросу с позиции комфорта и эффективности.

Оцените материал
Добавить комментарий

Капча загружается...