Игнорировать окончания строки при использовании Rsync

473
Sergio

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

Проблема в том, когда я выполняю этот код:

 rsync -azr --exclude=images --dry-run --delete --checksum --out-format="/%f" /dir1 /dir2 

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

С помощью diffэтого можно сделать следующее:

diff --strip-trailing-cr file1 file2 

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

3
Можете ли вы санировать файлы в обоих каталогах? Kamil Maciorowski 5 лет назад 1
Добро пожаловать в Супер пользователя Серджио! Интересный вопрос - я отредактировал его, чтобы сделать формулировку и форматирование более упорядоченным, не стесняйтесь откатиться, если хотите :) bertieb 5 лет назад 0

1 ответ на вопрос

4
bertieb

Там нет возможности игнорировать окончания строки для rsync

Как вы выяснили, rsyncфайлы с разными окончаниями строк считаются разными. Это неудобно в вашей ситуации, потому что файлы визуально / семантически одинаковы.

rsyncрешает, что синхронизировать в файле, основываясь на контрольных суммах блоков. На это есть хороший обзор :

(T) старая версия файла разбивается на блоки, например, 1024 или 2048 байт, и контрольная сумма рассчитывается для каждого блока.

Затем в новом файле выполняется поиск байтов для байтов для блоков с контрольными суммами, совпадающими с теми, что были в старой версии. Вот диаграмма, иллюстрирующая этот процесс:

diffing 1

Повторяя эти операции с новой версией файла, вы будете перебирать файл байт за байтом. Во время этой итерации вы найдете два типа данных в файле:

  • Блоки данных, которые совпадают с блоками в старом файле.
  • Последовательности байтов, которые не являются частью соответствующего блока.

От RSync - Обнаружение различий в файлах Якоб Дженков .

Если вам интересно, следующий раздел посвящен используемым контрольным суммам . Однако основной смысл контрольной суммы заключается в том, что она работает с байтами, а ваши файлы имеют разные байты из-за окончания строки . Таким образом, rsyncправильно определяет, что они разные, и передает их.

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

Лучшее решение сделать это - убедиться, что все ваши файлы имеют одинаковые окончания строк, или очистить их, как предложил Камил в комментариях.

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

Применить санитарию только к необходимым файлам

Если вы проводите санитарную обработку, убедитесь, что вы не применяете ее вслепую, поскольку Камил также предупреждает:

Не следует использовать какой-либо инструмент конвертации вслепую для всех файлов. Даже если инструмент пытается угадать, является ли файл текстовым или двоичным, это всего лишь эвристика. CRLF может появляться внутри двоичного файла; блоки, которые выглядят как текст, могут также появиться. Изменение бинарного файла путем удаления некоторых байтов, скорее всего, повредит его .

(акцент мой)

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

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

Полное решение выходит за рамки этого ответа. Есть несколько предложений по этой SO QA, в том числе dos2unix, tr, sed, awk, perl.

Например:

Вы можете использовать trдля преобразования из DOS в Unix; однако вы можете сделать это безопасно только в том случае, если CR появляется в вашем файле только как первый байт пары байтов CRLF. Обычно это так. Затем вы используете:

tr -d '\015' <DOS-file >UNIX-file 

Однако, если вам придется делать это очень часто (более одного раза, грубо говоря), гораздо разумнее установить программы преобразования (например, dos2unixи unix2dos, или, возможно, dtouи utod) и использовать их.

из ответа Джонатана Леффлера .

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

@KamilMaciorowski очень верно; Я избегал давать какие-либо конкретные рекомендации, поскольку это выходит за рамки этого вопроса, не зная настройки OP. Однако я обновлю ответ и вашим предупреждением. bertieb 5 лет назад 0
Хороший ответ мужчина !! Pimp Juice IT 5 лет назад 0

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