5

Это моя текущая ситуация (упрощенная, на самом деле, конечно, много и большие файлы):

Dir1/
  a b c
Dir2/
  a b c d

Это случилось раньше:

  • abc были скопированы из Dir1 в Dir2.
  • В Dir2 метки времени abc были изменены случайно.
  • Я был добавлен в Dir2 намеренно.

Теперь я хочу сделать это: Синхронизировать Dir2 обратно в Dir1. (К кому это относится: я использую rsync)

  • d новый и, следовательно, должен быть скопирован.
  • abc в Dir2 и Dir1 идентичны по размеру и содержанию данных, но их метки отличаются. Следовательно, они будут скопированы без необходимости .

Я знаю, что rsync может сравнивать файлы по --checksum или --size-only. Но эту интенсивную проверку диска / процессора придется повторять при каждой будущей синхронизации. Вместо этого я скорее хочу раз и навсегда исправить свою ошибку, восстановив исходные временные метки файлов из Dir1 в Dir2 с помощью инструмента. Тогда моя ошибка исправлена, и будущие синхронизации могут работать эффективно.

В Windows эти инструменты могут копировать только метки времени (без копирования данных):

  • Робокопия с опцией / КОПИЯ:T
  • WinSCP в режиме синхронизации временных меток

Кто-нибудь знает подходящий инструмент CLI / GUI для Mac OS X?

3 ответа3

1

Флаг --size-only в rsync не загружает ни процессор, ни диск по сравнению со стандартной проверкой rsync, на самом деле он быстрее, потому что обычно rsync проверяет как размер файла, так и метку времени. Вы можете использовать команду touch, чтобы явно сопоставить временные метки abc в Dir2. Вы можете снова удалить файлы в dir2 и rsync. Эти предложения хороши, если это тонна файлов, чтобы вы могли заключить их в скрипт или найти. Обратите внимание, что если вы просто запустите rsync снова, в обычном режиме, но также с --partial optinoal (скажем, rsync -az --partial Dir1 Dir2), он не будет копировать файлы снова, вместо этого он попытается их разумно синхронизировать который, как я полагаю, в этом случае закончился бы передачей только временных меток.

0

Я не уверен в хорошем способе сделать это с помощью rsync, и при этом у меня нет никакого опыта работы с max osx, хотя это попытка на linux, и я надеюсь, что он либо подойдет вам, либо будет «достаточно близок».

Предупреждение: это, безусловно, наименее элегантный способ добиться этого :)

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

#!/bin/bash
# warning, really inelegant bash follows
FROMDIR='dir1'
TODIR='dir2'

for FROMFILE in `find $FROMDIR -type f`; do
        TOFILE=`echo "$FROMFILE" | sed "s/^$FROMDIR/$TODIR/"`
        echo "trying $FROMFILE to $TOFILE"

        if [ -e "$TOFILE" ]; then
                NEWDATE=$(stat -c %y $FROMFILE | awk '{print $2, $1}')
                echo "would perform 'touch -d '$NEWDATE' $TOFILE'"
                #touch -d "$NEWDATE" $TOFILE # uncomment me if you want to perform changes
        fi  
done

когда вы в первый раз запустите это, он не будет вносить никаких изменений и вместо этого просто отобразит то, что сделал бы, если вы чувствуете, что это то, что вам нужно, то раскомментируйте строку #touch -d "$NEWDATE" $TOFILE


объяснение

stat -c %y filename

дает нам измененное время файла в удобочитаемом формате

touch -d "timestamp" filename

установит для измененной даты имени файла метку времени, однако касание кажется суетливым в течение требуемого формата времени (оно не совсем совпадает с выводом stat% y, и, похоже, также не позволяет использовать эпоху).

awk '{print $2,$1}'

переставит вывод из stat -c %y так, чтобы его можно было взять touch -d

сложив это вместе, мы получаем

NEWDATE=$(stat -c %y fromfile | awk '{print $2, $1}')
touch -d "$NEWDATE" tofile
0

Возможно ли, что временные метки не важны для вас? Из вопроса не ясно, заинтересованы ли вы в их сохранении или в выполнении rsyncs без необходимости копировать все эти данные. Если вам не нужны временные метки, вы можете использовать команду touch, чтобы установить конкретную дату для всех файлов на обеих машинах, чтобы они были одинаковыми. Что-то вроде:

find dirX -type f -print | xargs touch -t 201108250000

Тогда запуск rsync должен работать, не беспокоясь о том, что временные метки будут одинаковыми на обеих коробках. Я не рядом с моим OS X box, чтобы проверить, работает ли это, но я делал это в Linux раньше.

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