Передача резюме единственного файла rsync

xargs особенно полезен, когда Вы имеете список filepaths на stdin и хотите сделать что-то с ними. Например:

$ git ls-files "*.tex" | xargs -n 1 sed -i "s/color/colour/g"

Давайте исследуем это шаг за шагом:

$ git ls-files "*.tex"
tex/ch1/intro.tex
tex/ch1/motivation.tex
....

Другими словами, наш вход является списком путей, к которым мы хотим сделать что-то.

Для обнаружения, что xargs делает с этими путями должен добавить хороший прием echo перед Вашей командой, как так:

$ git ls-files "*.tex" | xargs -n 1 echo sed -i "s/color/colour/g"
sed -i "s/color/colour/g" tex/ch1/intro.tex
sed -i "s/color/colour/g" tex/ch1/motivation.tex
....

-n 1 аргумент заставит xargs превратить каждую строку в собственную команду. sed -i "s/color/colour/g" команда заменит все случаи color с colour для указанного файла.

Обратите внимание, что это только работает, если у Вас нет пробелов в Ваших путях. Если Вы делаете, необходимо использовать завершенные пути пустого указателя, как введено для xargs путем передачи -0 флаг. Использование в качестве примера было бы:

$ git ls-files -z "*.tex" | xargs -0 -n 1 sed -i "s/color/colour/g"

Который делает то же как, что мы описали выше, но также и работы, если один из путей имеет пространство в нем.

Это работает с любой командой, которая производит имена файлов, как произведено такой как find или locate. Если Вы, действительно оказывается, используете его в репозитории мерзавца с большим количеством файлов, хотя, могло бы быть более эффективно использовать его с git grep -l вместо git ls-files, как так:

$ git grep -l "color" "*.tex" | xargs -n 1 sed -i "s/color/colour/g"

git grep -l "color" "*.tex" команда даст список "*.tex" файлов, содержащих фразу "цвет".

52
07.10.2014, 18:27
5 ответов

Для возобновления прерванной копии необходимо использовать rsync --append. От объяснения страницы справочника --append:

Это заставляет rsync обновлять файл путем добавления данных на конец файла, который предполагает, что данные, которые уже существуют на стороне получения, идентичны с запуском файла на передающей стороне. [...] Подразумевает --inplace, [...]

Опция --inplace делает rsync (по) записи целевое содержание файла непосредственно; без --inplace, rsync был бы:

  1. создайте новый файл с временным именем,
  2. скопируйте обновленное содержание в него,
  3. подкачайте его с целевым файлом, и наконец
  4. удалите старую копию целевого файла.

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

Обратите внимание на это, если операция копии/обновления перестала работать на шагах 1.-3. выше, rsync удалит временный целевой файл; --partial опция отключает это поведение и rsync оставит частично переданные временные файлы в целевой файловой системе. Таким образом возобновление единственной операции копии файла не получит много, если Вы не назвали первое rsync с --partial или --partial-dir (тот же эффект как --partial, кроме того, сообщает rsync создать все временные файлы в определенном каталоге).

39
27.01.2020, 19:33
  • 1
    Спасибо!, Если частичный файл оставили mv или CP не rsync, будет rsync - добавлять, правильно возобновляют файл, копирующий? –  StackExchange for All 26.09.2010, 22:05
  • 2
    @Tim Короче говоря, --append делает rsync полагайте, что, если два соответствующих файла имеют другую длину, то более короткий идентичен начальной части более длинной. Так, да, если Вы начинаете копировать большой файл с cp и прервите процесс копии, затем rsync --append скопирует только остающуюся часть файла. (Отметьте: если cp прерван системным катастрофическим отказом, существует маленький шанс, что содержание файла и метаданные не находятся в синхронизации, т.е. файл повреждается. В этом случае, выполнение rsync еще раз без --append должен решить проблему.) –  Riccardo Murri 26.09.2010, 23:05
  • 3
    Таким образом, Если я понимаю это правильно, нет никакого способа сказать rsync проверять, что частичный файл и резюме передают тому частично переданному файлу? –  Winny 20.07.2014, 20:29
  • 4
    @Winny, очень запоздало: для локальной копии нет никакого разумного способа сделать это. Для сетевой копии это - режим по умолчанию, когда Вы указываете --partial без --append. –  roaima 17.04.2016, 10:55

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

2
27.01.2020, 19:33
  • 1
    Локальные копии не сравнены, они просто перезаписываются (или с --append продолженный от байтового смещения). –  roaima 17.04.2016, 10:51

David Schwartz корректен, --partial (или лучше, -P) действительно делает то, что Вы хотите. Я проверил это на 37G файл, который был остановлен ~8g в него по сети. rsync быстро просканировал первые части частичного (показывающий прогресс, когда он шел благодаря -P), и затем возобновленный передача в конец частичного файла.

6
27.01.2020, 19:33
  • 1
    сетевую копию рассматривают по-другому к локальной копии, которая является проблемой здесь. –  roaima 17.04.2016, 10:50
  • 2
    @roaima у Вас есть источник для этого или документ, который объясняет более подробно, каковы различия? Мне не удается найти его в (огромной) странице справочника. –  Jonas Schäfer 04.02.2018, 16:39
  • 3
    @JonasWielicki страница справочника ссылается на него под --whole-file описание опции. –  roaima 04.02.2018, 21:11
  • 4
    @roaima! Это также означает, что надлежащее обходное решение --no-W (который на самом деле работает!) –  Jonas Schäfer 04.02.2018, 22:11
  • 5
    @JonasWielicki это чрезвычайно неэффективно, который является, почему это отключено по умолчанию. Вы действительно не хотите использовать --no-W если Вы не понимаете точно, какую установку это означает для локальных файлов. Посмотрите, что unix.stackexchange.com/a/181018/100397 –  roaima 04.02.2018, 22:32

Знайте это --append подразумевает --inplace, который самостоятельно подразумевает --partial.

  • Просто используя --partial необходимо вызвать rsync оставить частичные передачи и возобновить их в последующих попытках.

  • При помощи --append необходимо вызвать rsync и оставить частичные файлы и возобновить их следующий раз. После передачи rsync должен проверить контрольную сумму переданных данных только.

  • --append-verify включает целый файл в проверку контрольной суммы, включая любую часть, переданную в предыдущей передаче.

  • С также --append или --append-verify неудавшаяся проверка контрольной суммы должна заставить файл ретранслироваться полностью (использование --inplace)

Необходимо смочь возобновить a mv или cp операция с rsync но можно хотеть использовать --append-verify опция для душевного спокойствия.

Отметьте то использование --append причины rsync скопировать только те файлы, которые имеют его размер на получателе короче, чем размер на отправителе (независимо от меток времени) или отсутствуют на получателе. Документацией относительно этой опции:

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

Больше информации в странице справочника

21
27.01.2020, 19:33

По умолчанию rsyncвключает --whole-fileпри переносе с локального диска на локальный диск. Это позволит перезапустить прерванную передачу с самого начала, а не проверять части, которые уже есть.

Чтобы отключить это, используйте:

--no-whole-file

Сочетание этого с --inplaceили --partialпозволит возобновить передачу позже.

Мой псевдоним для использования rsyncдля копирования —:

rscp='rsync -ax --inplace --sparse --no-whole-file --protect-args'

Предупреждение:Будьте осторожны при использовании --append-verify, так как будут пропущены все конечные файлы того же или большего размера.

3
27.01.2020, 19:33

Теги

Похожие вопросы