Восстановление свойств файла, но не полных файлов, из резервной копии

215
Jon

При копировании данных из моего старого хранилища на компьютере Linux на новый (на основе Linux) NAS я случайно не смог получить свойства (наиболее важные: даты изменения) вместе с новым местоположением. Я также продолжал использовать / изменять файлы в новом месте и, следовательно, не могу просто скопировать все заново.

Я хотел бы сделать различие между файлами в старом и новом хранилищах, а для тех, кто идентичен, восстановить свойства из хранилища Linux в файлы хранилища NAS.

Есть ли такой способ, как скрипт или инструмент для этого? Я мог бы запустить его на компьютере с Linux или, в худшем случае, с удаленного компьютера с Windows.

Благодарен за любые предложения. / Jon

2
Вы * можете * запустить криптографический хеш для файлов (возможно, SHA1), сравнить оба хэша каждого файла и, если они идентичны, «коснуться -m» файла NAS (с соответствующими настройками даты и времени). Это было бы взломать, но я думаю, что это будет работать. Elliott Frisch 10 лет назад 0
Hi Elliott, Thanks for the suggestion. Yes, I will probably have to spend a few hours to create a solution like this. I was hoping I could be lazy and make use of an already-existing tool for this but as a second option your idea is good. Jon 10 лет назад 0

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

0
Jon

Я просто подумал, что лучше поделиться кодом, который я придумал. Несмотря на то, что я не являюсь программистом bash, через Google доступно много знаний, поэтому я считаю, что этот код сделает всю работу за меня. В основном то, что это делает:

  • Просмотрите все файлы и папки в новом месте и для каждого:
    • проверьте, существует ли тот же файл в старом месте
      • Если нет, то напишите запись в журнал
      • Если да, совпадает ли отметка времени (изменить дату)?
        • Да - ничего не делать, кроме записи в журнал
        • Нет, временные метки не совпадают
          • Это либо каталог, либо содержимое файла идентичное? Затем сбросьте метку времени на метку времени файла в старом месте и запишите запись в журнале.
          • Если содержимое файла отличается, то временные метки могут также подойти. Просто напишите запись в журнале.

Код:

shopt -s globstar  NEWDIR="/home/jon" OLDDIR="/tmp/jon_old" LOGFILE=restoreDates_$(date "+%Y-%m-%d-%H%M%S").log  echo $LOGFILE > $LOGFILE  for f in "$NEWDIR"/** ; do OLDFILE=$(sed -e "s/$NEWDIR/$OLDDIR/" <<< $f)  # Does corresponding file exist in old directory?  if [ -a "$OLDFILE" ] ; then  # Do both files have the same modify date? if [ $(stat -c %Y "$f") -eq $(stat -c %Y "$OLDFILE") ] ; then echo "$OLDFILE already has same modify date/time as $f" >> $LOGFILE else  # Is this a directory? if [ -d "$f" ]; then echo "$f is a directory, modify timestamp will be reset to that of $OLDFILE; $(stat -c %y "$OLDFILE")" >> $LOGFILE touch -r "$OLDFILE" "$f" else # Not a directory - Is old file equal to the new? if $(cmp --silent "$f" "$OLDFILE"); then # yes echo "$OLDFILE and $f are identic, modify timestamp will be reset to $(stat -c %y "$OLDFILE")" >> $LOGFILE touch -r "$OLDFILE" "$f" else # File has changed echo "$OLDFILE differs from $f, which must have changed" >> $LOGFILE fi fi fi else # File does not exist in old directory echo "$OLDFILE does not exist (but $f do)" >> $LOGFILE fi  done; 

Любые комментарии к коду приветствуются.

Мои извинения за приведенное выше представление кода - я не смог перенести все это в поле кода ... Jon 9 лет назад 0

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