информация о прогрессе через pv для копирования каталога

14

Мне нужно скопировать очень большой каталог (здесь речь идет о терабайтах) и хочу следить за ходом работы.

Я обнаружил, что pvэто хорошая утилита, но как я могу использовать ее для рекурсивного копирования каталогов? ( pv src > dstне работает, потому что они каталоги)

PS: работает на OS X Mountain Lion, pvбыл установлен из портов Mac

FP
источник

Ответы:

21

использование rsync --progress [SRC] [DST]

Проверьте man rsyncстраницу, потому что она имеет много очень полезных опций. -aдля архива это хорошее начало, но это зависит от ваших точных требований.

Копирование по каналу излишне замедлит процесс копирования, особенно если он основан на файлах.

jippie
источник
Почему копирование через канал замедляет процесс? Я бы сказал, что буферизация, обеспечиваемая каналами, и многозадачность, связанная с каналами, могут помочь. (и rsync является многопроцессорным и использует внутренние каналы IIRC). Что такое процесс копирования, который не основан на файлах?
Стефан Шазелас
Баш удобен, но не быстр. Особенно при передаче одной команды другой.
Джиппи
@StephaneChazelas: потому что буфер канала всего 8 КБ. Такая программа, как rsync, может захотеть использовать гораздо больший внутренний буфер.
Zan Lynx
10

Вы можете использовать tarили paxили cpio:

mkdir -p dst &&
  (cd src && tar cf - .) | pv -trb | (cd dst && tar xpf -)
Стефан Шазелас
источник
1
Кроме того, вы можете добавить vк tarкоманде, чтобы увидеть имена файлов.
Петер
Так что это будет архивировать исходную папку перед копированием, верно? Моя папка имеет размер 5 ТБ, поэтому я не уверен, что это лучший способ сделать это? Мне действительно нравится использовать pv, так как он показывает действительно хороший прогресс, какой совет, пожалуйста?
Так
@ Так, нет, это ничего не застегивает, потому что нет сжатия. tar cf -выводит поток, содержащий файлы и их метаданные, который подается по каналу в pv, который передает его нетронутым другому tarво время печати индикатора выполнения, а другой tarизвлекает данные в этом потоке. Все три команды выполняются одновременно и обрабатывают данные по мере их поступления, на диске ничего не хранится, в памяти ничего не хранится, кроме конвейерных буферов и внутренних буферов команд, которые составляют всего несколько килобайт.
Стефан Шазелас
@ StéphaneChazelas Спасибо за комментарий. Я попробовал это, и это работает, единственное, что индикатор выполнения не показывает ожидаемый процент, который он продолжает идти слева направо. Есть идеи почему? Я использовал pv с этими параметрами -petra, который обычно показывает индикатор выполнения, где бар продолжал заполняться, пока не закончил. Я также проголосовал за ваш ответ.
Так
@ Так, pvнет никакой возможности узнать, сколько данных нужно передать. Если у вас есть оценка этой суммы, вы можете передать ее с помощью -sопции (GNU du -sb srcдаст вам хорошее приближение, если файлы будут достаточно большими)
Стефан Шазелас
2

Тар.

tar -cf - /var/log/ | pv | tar -C . -x

Пример:

# tar -cf - /var/log/ | pv | tar -C . -x
tar: Removing leading `/' from member names
58MB 0:00:05 [ 2.2MB/s] [                   <=> 
Аномальный трепет
источник
1

Вот несколько команд для копирования каталогов с информацией о прогрессе.


Если есть много маленьких файлов:

cp -av sourcedir targetdir | pv -l -s filecount > logfile

Это будет сообщать о прогрессе в зависимости от количества скопированных файлов.

Вы можете перенаправить, /dev/nullесли вам не нужно logfile.

Используйте следующую команду, чтобы получить filecount:

find sourcedir | wc -l

Если есть несколько огромных файлов:

tar c sourcedir | pv -s size | tar x -C targetdir

Это сообщит о прогрессе на основе скопированных байтов.

targetdir должен существовать.

Используйте следующую команду, чтобы получить size:

du -sh sourcedir

Если вы хотите использовать rsync:

rsync -ai sourcedir/ targetdir/ | pv -l -s filecount > logfile

Получите filecountкак показано выше.

Если вы копируете в той же системе, то rsync -aпрактически так же, как cp -a. Преимущества rsync - это когда вы копируете по сети или обновляете (или сравниваете) предыдущую копию.

Смотрите здесь для более подробной информации:

lesmana
источник
0

Вы можете выполнить операции du -b /directory/как для источника, так и для места назначения, пока выполняется обычная команда копирования, и сравнить их. Это так же эффективно и не замедляет процесс копирования, проталкивая его через канал.

апостол
источник
-1
find source-dir -print0 | xargs -0 -I % pv % > dest-dir/%
Кристофер Хилла
источник
3
Пожалуйста, объясните экскурсию, вы захотите, чтобы ОП смог ее проверить (и выучить)
vonbrand