2

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

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

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

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

1 ответ1

0

Я просто подумал, что лучше поделиться кодом, который я придумал. Несмотря на то, что я не являюсь программистом 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;

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

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