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" файлов, содержащих фразу "цвет".
Для возобновления прерванной копии необходимо использовать rsync --append
. От объяснения страницы справочника --append
:
Это заставляет rsync обновлять файл путем добавления данных на конец файла, который предполагает, что данные, которые уже существуют на стороне получения, идентичны с запуском файла на передающей стороне. [...] Подразумевает
--inplace
, [...]
Опция --inplace
делает rsync
(по) записи целевое содержание файла непосредственно; без --inplace
, rsync
был бы:
Нормальный режим работы главным образом предотвращает конфликты с приложениями, которые могли бы иметь целевой открытый файл, и несколько других неудач, которые должным образом перечислены в rsync
страница справочника.
Обратите внимание на это, если операция копии/обновления перестала работать на шагах 1.-3. выше, rsync
удалит временный целевой файл; --partial
опция отключает это поведение и rsync
оставит частично переданные временные файлы в целевой файловой системе. Таким образом возобновление единственной операции копии файла не получит много, если Вы не назвали первое rsync
с --partial
или --partial-dir
(тот же эффект как --partial
, кроме того, сообщает rsync
создать все временные файлы в определенном каталоге).
Вы делали его правильно --partial
делает то, что Вы хотите. Это, кажется, запускается с начала, потому что это всегда запускается в начале списка данных файла, разделяет его на блоки, должен скопировать. --append
опция опасна и приведет к поврежденному файлу, если данные не соответствуют по некоторым причинам.
--append
продолженный от байтового смещения).
– roaima
17.04.2016, 10:51
David Schwartz корректен, --partial
(или лучше, -P
) действительно делает то, что Вы хотите. Я проверил это на 37G файл, который был остановлен ~8g в него по сети. rsync быстро просканировал первые части частичного (показывающий прогресс, когда он шел благодаря -P
), и затем возобновленный передача в конец частичного файла.
--whole-file
описание опции.
– roaima
04.02.2018, 21:11
--no-W
(который на самом деле работает!)
– Jonas Schäfer
04.02.2018, 22:11
--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
скопировать только те файлы, которые имеют его размер на получателе короче, чем размер на отправителе (независимо от меток времени) или отсутствуют на получателе. Документацией относительно этой опции:
Если файл должен быть передан, и его размер на получателе является тем же или дольше, чем размер на отправителе, файл пропускается.
Больше информации в странице справочника
По умолчанию rsync
включает --whole-file
при переносе с локального диска на локальный диск. Это позволит перезапустить прерванную передачу с самого начала, а не проверять части, которые уже есть.
Чтобы отключить это, используйте:
--no-whole-file
Сочетание этого с --inplace
или --partial
позволит возобновить передачу позже.
Мой псевдоним для использования rsync
для копирования —:
rscp='rsync -ax --inplace --sparse --no-whole-file --protect-args'
Предупреждение:Будьте осторожны при использовании --append-verify
, так как будут пропущены все конечные файлы того же или большего размера.
--append
делаетrsync
полагайте, что, если два соответствующих файла имеют другую длину, то более короткий идентичен начальной части более длинной. Так, да, если Вы начинаете копировать большой файл сcp
и прервите процесс копии, затемrsync --append
скопирует только остающуюся часть файла. (Отметьте: еслиcp
прерван системным катастрофическим отказом, существует маленький шанс, что содержание файла и метаданные не находятся в синхронизации, т.е. файл повреждается. В этом случае, выполнениеrsync
еще раз без--append
должен решить проблему.) – Riccardo Murri 26.09.2010, 23:05--partial
без--append
. – roaima 17.04.2016, 10:55