2

История вопроса и проблема

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

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

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

  • У меня есть резервный внешний жесткий диск со всеми моими старыми данными и правильными датами модификации
  • У меня есть жесткий диск Mac с датами сброса файла модификации (один или два дня)
  • Жесткий диск Mac имеет все "истинное" и "текущее" содержимое файла с файлами, измененными и добавленными

Что мне нужно

Мне необходимо

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

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

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

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

1 ответ1

1

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

По сути, этот инструмент заключается в том, что он берет даты последнего изменения файлов в одной структуре папок и применяет их к файлам в другой папке при условии ТО;

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

Я запустил его на ~ 500 000 файлов, и он, кажется, работает нормально

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

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

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

Как изменить дату изменения файла в 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, если у вас много файлов и папок.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .