it-swarm-ru.tech

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

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

129
letronje

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

50
fschmitt

Мне не нравится идея перезаписывать двоичные файлы из 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 Shell, поэтому он будет работать повсюду.

96
echox

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

progress -w

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

92
naugtur

Вы можете использовать просмотрщик каналов команду 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 показывает только прогресс, а не индикатор выполнения.

36
Lamnk

Если ваша цель - переместить/скопировать каталог с индикатором выполнения, но избегая нетерминального графического интерфейса, mc (Midnight Commander) является хорошим выбором.

6
Christian Madsen

Мое решение состоит в том, чтобы использовать 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, который показывает ход выполнения всей операции.

4
Tobia

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

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

2
HandyGandy

Это не даст вам индикатор выполнения, но нажмите 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%
2
Charles

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

gcp SOURCE DESTINATION

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

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

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

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

curl -o DESTINATION FILE://source

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

2
ThePentadactyl

Чтобы избежать исправлений в coreutil, добавьте индикатор выполнения к mv и ​​cp, gcp (CoPier Гоффи) - это новая альтернатива: http: //wiki.goffi. орг/вики/GCP/еп

Использовать так же, как cp с параметрами -r для рекурсивности и -v для многословия.

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

Вот хорошее руководство, чтобы начать работу с gcp: http://mylinuxbook.com/gcp-advanced-command-line-file-copier-inspired-by-cp/

2
Yves Martin

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

1
lesmana

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

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

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

1
qazmonk

Я использую следующий скрипт, сохраненный с именем rsmv:

#!/usr/bin/env bash

rsync -aP --remove-source-files "[email protected]" && rm -rf "${@:1:$#-1}"

Он обрабатывает более одного источника и имена файлов с пробелами:

$ rsmv source1 source2 source\ 3 "source 4" dest
0
mixel