Вот объединение решения find
и ed
.
add_header() {
declare regex IFS='|'
(( $# )) && regex="^($*)$" || regex=""
find "$PWD" -type f -exec bash -c '
( exec grep -E -qs -e "$0" <<<"${1##*/}" ) || exit
_dirname="${1%/*}"
_dirname="${_dirname##*/}"
exec ed -s "${1}" <<EOF
0a
# Student: ${_dirname}
.
wq
EOF
' "${regex:-.+}" '{}' \;
return 0
}
add_header # all files in current directory recursively
add_header file1 file2 file3 # only named files in current directory recursively
Я думаю, что Вы насильственно звоните rsync
и следовательно все данные становятся загруженными, когда Вы вспоминаете это снова. использовать --progress
опция скопировать только те файлы, которые не копируются и --delete
опция удалить любые файлы, если уже скопировано и теперь это не существует в исходной папке...
rsync -avz --progress --delete -e /home/path/folder1/ /home/path/folder2
Если Вы используете ssh, чтобы войти в другую систему и скопировать файлы,
rsync -avz --progress --delete -e "ssh -o UserKnownHostsFile=/dev/null -o \
StrictHostKeyChecking=no" /home/path/folder1/ /home/path/folder2
сообщите мне, существует ли ошибка в моем понимании этого понятия...
-P Вы можете добавить опцию -P
к вашей команде.
Со страницы man
:
-частичная По умолчанию rsync удалит любой частично переданный файл, если передача прервано. В некоторых случаях более желательно сохранить частично переданные файлы. Использование опции --partial указывает rsync сохранить частичный файл, который должен сделать последующую передачу оставшейся части файла намного быстрее. -Опция -P эквивалентна -частичному -прогрессу. Его цель - поза заключается в том, чтобы намного проще указать эти два варианта для длительный перевод, который может быть прерван.
Так что вместо:
sudo rsync -azvv /home/path/folder1/ /home/path/folder2
Do:
sudo rsync -azvvP /home/path/folder1/ /home/path/folder2
Конечно, если вам не нужны обновления прогресса, вы можете просто использовать -частичное
, т.е.:
sudo rsync --partial -azvv /home/path/folder1/ /home/path/folder2
Просто укажите частичный каталог, как рекомендует rsync man pages:
--partial-dir=.rsync-partial
На самом деле существует встроенная возможность сделать это с помощью опции --partial-dir
, которая имеет несколько преимуществ перед альтернативами --partial
и --append-verify
/--append
.
--partial-dir=DIR
A better way to keep partial files than the --partial option is
to specify a DIR that will be used to hold the partial data
(instead of writing it out to the destination file). On the
next transfer, rsync will use a file found in this dir as data
to speed up the resumption of the transfer and then delete it
after it has served its purpose.
Note that if --whole-file is specified (or implied), any par-
tial-dir file that is found for a file that is being updated
will simply be removed (since rsync is sending files without
using rsync's delta-transfer algorithm).
Rsync will create the DIR if it is missing (just the last dir --
not the whole path). This makes it easy to use a relative path
(such as "--partial-dir=.rsync-partial") to have rsync create
the partial-directory in the destination file's directory when
needed, and then remove it again when the partial file is
deleted.
If the partial-dir value is not an absolute path, rsync will add
an exclude rule at the end of all your existing excludes. This
will prevent the sending of any partial-dir files that may exist
on the sending side, and will also prevent the untimely deletion
of partial-dir items on the receiving side. An example: the
above --partial-dir option would add the equivalent of "-f '-p
.rsync-partial/'" at the end of any other filter rules.
По умолчанию rsync использует случайное имя временного файла, которое удаляется при неудачной передаче. Как упоминалось, используя --partial
, вы можете заставить rsync сохранить неполный файл как если бы он был успешно передан, чтобы впоследствии можно было добавить к нему файл с помощью опций --append-verify
/--append
. Однако есть несколько причин, по которым это неоптимально.
Ваши файлы резервного копирования могут быть неполными, и без проверки удаленного файла, который должен быть все еще неизменен, нет способа узнать это.
Если вы пытаетесь использовать --backup
и --backup-dir
, вы только что добавили в историю версий новую версию этого файла, который до этого даже не выходил.
Однако если мы используем --partial-dir
, rsync сохранит временный частичный файл, и возобновит загрузку, используя этот частичный файл при следующем запуске, и мы не будем страдать от вышеописанных проблем.
Прежде всего, что касается части вашего вопроса «возобновить», - partial
просто указывает принимающей стороне сохранить частично переданные файлы, если отправляющая сторона исчезает, как если бы они были полностью перенесены.
При передаче файлов они временно сохраняются как скрытые файлы в своих целевых папках (например, .TheFileYouAreSending.lRWzDC
) или в специально выбранной папке, если вы устанавливаете - partial-dir
переключатель. Если передача не удалась и - частичный
не установлен, этот скрытый файл останется в целевой папке под этим загадочным именем, но если установлено - частичное
, файл будет переименовано в фактическое имя целевого файла (в данном случае TheFileYouAreSending
), даже если файл не является полным. Дело в том, что позже вы можете завершить передачу, снова запустив rsync с помощью - append
или - append-verify
.
Итак, - partial
не сам возобновляет неудачную или отмененную передачу. Чтобы возобновить его, вам нужно будет использовать один из вышеупомянутых флагов при следующем запуске.Итак, если вам нужно убедиться, что цель никогда не будет содержать файлы, которые кажутся нормальными, но на самом деле являются неполными, вам не следует использовать - partial
. И наоборот, если вы хотите убедиться, что вы никогда не оставляете после себя случайные неудачные файлы, которые скрыты в целевом каталоге, и знаете, что сможете завершить перенос позже, - частичный
здесь, чтобы помочь ты.
Что касается упомянутого выше переключателя - append
, это фактический переключатель «возобновления», и вы можете использовать его независимо от того, используете вы также - partial
]. Фактически, когда вы используете - append
, никакие временные файлы никогда не создаются. Файлы записываются прямо в свои целевые объекты. В этом отношении - append
дает тот же результат, что и - partial
при неудачной передаче, но без создания этих скрытых временных файлов.
Итак, подведем итог: если вы перемещаете большие файлы и хотите, чтобы была возможность возобновить отмененную или неудачную операцию rsync с той точки, в которой остановлен rsync
, вам необходимо использовать ] - добавить
или - добавить-проверить
при следующей попытке.
Как указывает @Alex ниже, начиная с версии 3.0.0 rsync
теперь имеет новый параметр - append-verify
, который ведет себя как - append
до того, как существовал этот переключатель. Вероятно, вам всегда нужно поведение - append-verify
, поэтому проверьте свою версию с помощью rsync --version
.Если вы работаете на Mac и не используете rsync
из homebrew
, у вас (по крайней мере, до El Capitan включительно) будет более старая версия, и вам нужно будет использовать --append
вместо - append-verify
. Почему они не сохранили поведение на -append
и вместо этого назвал новичка - append-no-verify
немного озадачивает. В любом случае, - добавление
в rsync
перед версией 3 такое же, как - append-verify
в более новых версиях.
- append-verify
не опасен: он всегда будет читать и сравнивать данные на обоих концах, а не просто предполагать, что они равны. Он делает это с использованием контрольных сумм, поэтому это легко в сети, но для этого требуется прочитать общий объем данных на обоих концах провода, прежде чем он сможет фактически возобновить передачу, добавив к цели.
Во-вторых, вы сказали, что «слышали, что rsync может находить различия между источником и местом назначения и, следовательно, просто копировать различия».
Это верно, и это называется дельта-передачей, но это другое вещь. Чтобы включить это, вы добавляете переключатель -c
или - контрольная сумма
. После использования этого переключателя rsync проверит файлы, существующие на обоих концах сети. Он делает это по частям, сравнивает контрольные суммы на обоих концах и, если они различаются, передает только разные части файла. Но, как указывает @Jonathan ниже, сравнение выполняется только тогда, когда файлы имеют одинаковый размер на обоих концах - разные размеры заставят rsync загрузить весь файл, перезаписав цель с тем же именем.
Это требует сначала немного вычислений на обоих концах, но может быть чрезвычайно эффективным для снижения сетевой нагрузки, если, например, вы часто выполняете резервное копирование очень больших файлов файлов фиксированного размера, которые часто содержат незначительные изменения.Примерами, которые приходят на ум, являются файлы образов виртуальных жестких дисков, используемые в виртуальных машинах или цели iSCSI.
Примечательно, что если вы используете - контрольную сумму
для передачи пакета файлов, совершенно новых для целевой системы, rsync все равно будет вычислять их контрольные суммы в исходной системе перед их передачей. Почему я не знаю :)
Итак, вкратце:
Если вы часто используете rsync, чтобы просто «перемещать данные из A в B» и хотите отменить эту операцию, а затем возобновить ее, не используйте - контрольную сумму
, но используйте используйте - append-verify
.
Если вы часто используете rsync для резервного копирования, использование - append-verify
, вероятно, мало что вам даст, если только у вас нет привычки отправлять большие файлы, размер которых постоянно увеличивается. по размеру, но редко изменяются после написания. В качестве бонуса: если вы выполняете резервное копирование в хранилище, поддерживающее моментальные снимки, например btrfs
или zfs
, добавление переключателя - inplace
поможет вам уменьшить размеры снимков, поскольку измененные файлы не воссоздаются, а измененные блоки записываются непосредственно поверх старых. Этот переключатель также полезен, если вы не хотите, чтобы rsync создавал копии файлов на целевом компьютере, когда произошли только незначительные изменения.
При использовании - append-verify
, rsync будет вести себя так же, как и всегда, для всех файлов одинакового размера. Если они отличаются модификацией или другими отметками времени, он перезапишет цель с источником без дальнейшего изучения этих файлов. - контрольная сумма
будет сравнивать содержимое (контрольные суммы) каждой пары файлов с одинаковым именем и размером.
ОБНОВЛЕНО 01.09.2015 Изменено, чтобы отразить замечания, сделанные @Alex (спасибо!)
ОБНОВЛЕНО 14.07.2017 Изменено, чтобы отразить замечания, сделанные @Jonathan (спасибо!)
Я использую этот простой скрипт. Не стесняйтесь настраивать определенные флаги и/или параметризовать их.
#!/bin/bash
while [ 1 ]
do
rsync -avz --partial [source] [dest]:
if [ "$?" = "0" ] ; then
echo "rsync completed normally"
exit
else
echo "Rsync failure. Backing off and retrying in 180 s..."
sleep 180
fi
done
Перед запуском скрипта вы должны заменить [source]
и [dest]
своими фактическими значениями.
Поздно пришел к этому, но у меня был тот же вопрос, и я нашел другой ответ.
Флаг --partial
(«сохранять частично переданные файлы» вrsync -h
)полезен для больших файлов, как и--append
(«добавлять данные в более короткие файлы» ), но вопрос касается большое количество файлов.
Чтобы исключить файлы, которые уже были скопированы, используйте-u
(или--update
:"пропустить более новые файлы на приемнике" ).
Для тех, кто использует графический интерфейс Grsync, соответствующая конфигурация выглядит следующим образом:
Во вкладке «Дополнительные параметры» установите (не менее )флажок «Сохранить частично переданные файлы ».
Затем в поле «Дополнительные параметры» введите:
--append-verify
Затем Файл-> Моделирование :, чтобы проверить, будет ли передача работать (, если вы столкнулись с ошибкой, вы можете проверить другие выбранные параметры, источник и место назначения ).
И, наконец, Файл-> Выполнить .
С этой конфигурацией, если передача не удалась, вы можете просто закрыть окно передачи и Файл-> Выполнить еще раз. Он возобновит передачу с того места, где она была прервана.
Несколько важных правил:
rsync
используйте дельта-алгоритм -xfer, чтобы определить, будут ли повторно отправляться блоки, отличающиеся друг от друга, за исключением опции -W, --whole-file
. rsync
запишет данные во временный каталог и переместит их в место назначения по завершении, за исключением опции --inplace
. --append
,но идентичность частичных отправленных данных должна быть обеспечена вами самостоятельно. --append
влечет --inplace
, что само по себе влечет--partial
В моем случае я хочу отправлять добавочные файлы без чрезмерной нагрузки на ЦП и диск, команда
rsync -avPL --inplace --append --bwlimit 30m -e 'ssh -o StrictHostKeyChecking=no' <src> <dst>
--delete
удалит файлы в месте назначения, которые не существуют в источнике. Менее серьезный - это--progress
не изменяет, как копируются вещи; это просто дает Вам отчет о выполнении работ на каждом файле, поскольку это копирует. (Я зафиксировал серьезную ошибку; замененный это--remove-source-files
.) – Paul d'Aoust 18.11.2016, 00:39