从备份中恢复文件属性,但不恢复完整文件

从备份中恢复文件属性,但不恢复完整文件

在将数据从 Linux 计算机上的旧存储复制到新的(基于 Linux 的)NAS 时,我意外地无法将属性(最重要的:修改日期)传输到新位置。我还继续在新位置使用/修改文件,因此无法再次复制。

我想要做的是比较旧存储和新存储中的文件之间的差异,对于相同的文件,将属性从 Linux 存储恢复到 NAS 存储文件。

有没有巧妙的方法(例如脚本或工具)来做到这一点?我可以在 Linux 机器上运行它,或者在最坏的情况下从远程 Windows 计算机运行它。

感谢任何建议。/乔恩

答案1

我只是觉得我最好分享一下我写的代码。虽然我不是一名 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;

欢迎对代码提出任何意见。

相关内容