在将数据从 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;
欢迎对代码提出任何意见。