Перезаписать файл при копировании, ЕСЛИ содержимое одного из них не совпадает

#linux #deployment #console #copying #mc

#linux #развертывание #консоль #копирование #mc

Вопрос:

У меня много файлов с одной стороны (A) и много других файлов в другом месте (B)

Я копирую A в B, там много одинаковых файлов, но содержимое может быть другим!

Обычно я использовал mc (Midnight Commander) для этого и выбирал «Перезаписать, если другой размер». Но бывает ситуация, когда размер одинаков, но содержимое отличается. В этом случае mc сохраняет файл в месте B и не перезаписывает его.

В диалоговом окне перезаписи mc есть работа «Обновление», я не знаю, что он делает? В справке нет такой информации, может быть, это решение?

Итак, я ищу решение, которое может помочь мне скопировать все файлы из A в B и перезаписать файлы в месте B, если они существуют, А содержимое отличается от A.

если файл в месте «B» существует (с тем же именем), а содержимое отличается, его нужно каждый раз перезаписывать файлом из места «A».

Знаете ли вы какое-либо решение?

Комментарии:

1. кстати, все файлы являются обычными текстовыми файлами

Ответ №1:

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

 #> rsync -cr <directory to copy FROM> <directory to copy TO>
 

Rsync копирует файлы либо на удаленный хост, либо с него, либо локально на текущем хосте (он не поддерживает копирование файлов между двумя удаленными хостами).

 -c, --checksum    skip based on checksum, not mod-time amp; size
-r, --recursive   recurse into directories
 

Смотрите man rsync Дополнительные параметры и подробности.

Комментарии:

1. Ключевым моментом -c здесь является переключатель. Я хотел избежать изменения «измененной» временной метки и сравнивать содержимое файла, а не только временные метки. Спасибо!

Ответ №2:

Вы пробовали командную строку:

 cp -ru A/* B/
 

Следует рекурсивно скопировать все измененные файлы (более позднюю временную метку) из каталога A в каталог B.

Вы также можете использовать -a вместо -r в командной строке, в зависимости от того, что вы хотите сделать. Смотрите cp справочную страницу.

Комментарии:

1. кажется, это то, что мне нужно — u означает копировать только тогда, когда ИСХОДНЫЙ файл более новый, чем файл назначения, или когда файл назначения отсутствует, но какую временную метку он ищет? рекордное время? и на самом деле это не идеальное решение, но, возможно, на данный момент проще всего, спасибо.

Ответ №3:

Возможно, вам захочется сохранить какой-то «индексный» файл, содержащий хэш SHA-1 файлов, которые вы создаете при их записи. Затем вы можете вычислить «исходный» хэш и сравнить его с «целевым» хэшем из индексного файла. Это сработает, только если этот процесс является единственным способом записи файлов в пункт назначения.

Комментарии:

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

2. Не от руки, нет, но звучит забавно писать самостоятельно, используя библиотеку openssl 🙂

Ответ №4:

http://linux.math.tifr.res.in/manuals/man/mc.html

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