Вопрос: Как я могу (на Mac / Unix / Linux / scripting) рекурсивно копировать каталог в другой и заменять только те файлы, которые не изменились?


Предыстория и проблема

Недавно я перешел в Mac OS X и столкнулся с «функцией» Mac, где копирование файлов с внешнего накопителя сбрасывает дату изменения файла / дату обновления / отметку времени до текущей даты (в Windows это не так), что приводит к катастрофе для моего 10+ лет резервного копирования рабочих файлов, где дата важна.

Итак, прежде чем я узнал, как этого избежать (например, используя флаг -p «сохранить» в команде «cp»), я тем временем добавил к моему новому жесткому диску Mac еще много файлов, а также обновил существующие старые файлы.

Текущее состояние

  • У меня есть резервный внешний жесткий диск со всеми моими старыми данными и правильными датами изменения
  • У меня есть жесткий диск Mac с датами изменения настроек сброса (один или два отдельных дня)
  • На жестком диске Mac есть все «истинное» и «текущее» содержимое файла с измененными и добавленными файлами

Что мне нужно

мне нужно

  • Скопируйте все исходные файлы с внешнего жесткого диска, сохранив метаданные файлов (на самом деле только измененную дату), но ТОЛЬКО переопределяя новый внутренний жесткий диск Mac IF
    • Содержимое файла (md5 или любой другой) является тем же OR
    • Файл был обновлен после дня (который, конечно, я могу видеть во всех файлах), на котором был выполнен оригинальный аварийный cope (подразумевая, что файл является новым или измененным)
  • Убедитесь, что копия полностью не содержит все новые и измененные файлы на внутреннем жестком диске Mac.
  • «Нет необходимости запрашивать / останавливать копию любого типа (т. Е. Не многословную), но это o.k."
  • «Рекурсивная копия - очевидно, я хотел бы скопировать все * файлы папок и подпапок, найденных в экспорт»

Как это можно сделать, любая идея?

Я прочитал все, что мог, на Stack Overflow и проверил man-страницы и информацию на «rsync» и «cp», но не смог найти способ ...

У кого-нибудь есть хорошие инструменты, скрипты, трюки, идеи?


2
2018-04-25 08:09


Источник


Копирование файлов с внешних дисков в Finder не изменяет дату их изменения. - Daniel Beck♦
Скопируйте все с диска снова, сохраняя атрибуты неповрежденными. Сделайте сопоставление папок с помощью DiffMerge или FileMerge или любых других утилит сравнения иерархии папок с потенциально модифицированными файлами и оригиналами внешнего диска, они скопируют измененные файлы поверх вашей новой «архивной» копии вручную. Если их не так много, это самое быстрое решение. - Daniel Beck♦
Я посмотрел на эти инструменты (если бы они оба использовали DiffMerge для сравнения кода в прошлом), они, похоже, не могут разрезать его каким-либо разумным образом. Кроме того, на самом деле существует 100 тысяч файлов (документы , заметки, письма, фрагменты кода и т. д.), поэтому его немного волосатая задача. Если у кого-то есть другие предложения, это будет оценено. Просто посмотрел на Java API, и я могу изменить даты изменения файла, это решение, но я полагаю, что потребуется некоторое время для написания и тестирования. Любые другие идеи? - Daniel Iversen
Недавно я использовал довольно большой find выражение в системе Linux, чтобы найти различия между двумя файловыми системами. я имел find печатать полные пути и атрибуты файлов (если они не были папками, их размеры в значительной степени бесполезны), а также exec одна из программ контрольной суммы (md5sum Я думаю). Я подавал вывод в файлы и менял их. Вы можете это сделать, а затем использовать файлы, определенные таким образом, как входные данные для любого скрипта копирования (либо в виде включения, либо исключения). - Daniel Beck♦
я думаю rsync может это сделать. - Keith


Ответы:


Закончилось писать java-программу, чтобы сделать это ... Не размещайте здесь код, потому что его быстрые, грязные и спагетти;) ... Однако он надежный, и вы можете загрузить простой исходный код из www.nexle.dk/permanent-downloads/StackExchange/FileModChanger.java.zip использовать, модифицировать, компилировать и использовать свободно (но без проверки, проверки и проверки перед запуском).

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

  • имена файлов и пути одинаковы (безопасность)
  • содержимое файла совпадает (проверка md5, опять же для безопасности)
  • дата уже не одинакова для обоих файлов

Я запустил его против ~ 500 000 файлов и, похоже, работал o.k.

Некоторые заметки;

  • он изменяет только измененную дату / время / временную метку, поэтому она должна быть безопасной
  • инструмент по умолчанию используется в режиме «сухого хода», что означает, что он покажет вам, что он будет делать, но не будет выполнять изменения («реальный» режим активируется аргументом командной строки «реальный»)
  • Он использует некоторый код из Интернета (кредит внутри исходного файла).
  • Это может быть быстрее, но достаточно быстро
  • Он имеет милый маленький индикатор прогресса во время разбора всех каталогов для файлов в первый раз;)

Некоторый код, который вы, возможно, сможете извлечь из него, если вы хотите протащить весь код;

Как изменить дату изменения файла в Java;

    File sourceFile = new File("/tmp/sourcefile");      
    File targetFile = new File("/tmp/targetfile");

    long sourceDateModified = sourceFile.lastModified();

    targetFile.setLastModified(sourceDateModified);

Надеюсь, кто-то еще сможет найти его полезным. Спасибо за все комментарии и подсказки.


Использование и консольный вывод для готового инструмента, который вы можете скачать (см. Выше);

$ java -classpath . FileModChanger 

USAGE (dry run, NO file changes made):
  FileModChanger <source folder with  original dates> <target folder with new/erased dates>

USAGE (real run,file date changes WILL be made):
  FileModChanger <source folder with  original dates> <target folder with new/erased dates> real





$ java -classpath . FileModChanger /Volumes/Untitled/D/knowledge/ISYS\ Desktop\ 6/ /Knowledge/ISYS\ Desktop\ 6/
Starting DRY run....
Starting DRY run....
Starting DRY run....
Starting to retrieve list of files (this may take a LONG time)...
0 folders processed 
DONE creating the list of files, starting comparison...



About to operate on Volumes/Untitled/D/knowledge/IS[...]S Desktop 6/ISYSDesktop6Setup.exe:
 SRC:Tue Jul 01 11:29:46 EST 2003 - bff684bfac4ed37e4a6b9a05ab625855 - Volumes/Untitled/D/knowledge/IS[...]S Desktop 6/ISYSDesktop6Setup.exe
 TRG:Tue Dec 21 04:05:24 EST 2010 - bff684bfac4ed37e4a6b9a05ab625855 - /Knowledge/ISYS Desktop 6/ISYSDesktop6Setup.exe


DONE processing all files..










$ java -classpath . FileModChanger /Volumes/Untitled/D/knowledge/ISYS\ Desktop\ 6/ /Knowledge/ISYS\ Desktop\ 6/ real
Starting REAL run....
Starting REAL run....
Starting REAL run....
Starting to retrieve list of files (this may take a LONG time)...
0 folders processed 
DONE creating the list of files, starting comparison...



About to operate on Volumes/Untitled/D/knowledge/IS[...]S Desktop 6/ISYSDesktop6Setup.exe:
 SRC:Tue Jul 01 11:29:46 EST 2003 - bff684bfac4ed37e4a6b9a05ab625855 - Volumes/Untitled/D/knowledge/IS[...]S Desktop 6/ISYSDesktop6Setup.exe
 TRG:Tue Dec 21 04:05:24 EST 2010 - bff684bfac4ed37e4a6b9a05ab625855 - /Knowledge/ISYS Desktop 6/ISYSDesktop6Setup.exe
 RESULT:
   - BEFORE:    Tue Dec 21 04:05:24 EST 2010
   - AFTER:     Tue Jul 01 11:29:46 EST 2003
DONE processing all files..

Кроме того, вам может потребоваться увеличить память Java, если у вас много файлов и папок.


1
2018-04-26 05:23