自从我将公司的文件系统从旧的 ubuntu 12 更改为 Synology NAS 后,我遇到了文件属性问题。
我最初在旧文件系统上安装了 NFS 共享,然后使用 cp 复制了所有内容,一切正常,但我忘了保留属性,我们丢失了尤其是日期,日期变成了复制日期,而不是真实日期。
我找到了 rsync 命令 rsync -vrt --size-only /src /dest 但是自复制以来某些文件已被修改,并且该命令会覆盖它们......
例如,我尝试在旧文件系统上创建一个文件,将其复制到新 synology 上,然后在 synology 上修改该文件。当我使用 rsync 时,该文件被删除并被旧版本替换。
我正在寻找一个命令,仅当文件具有完全相同的大小(尚未被修改)时才复制文件的时间戳
无论需要多长时间
编辑 : 我使用测试目录尝试了提出的解决方案,没有错误,但也没有任何变化:
old_base=/home/samba/shares/projects/test
new_base=/mnt/NAS
cp $old_base $new_base -rv
`/home/samba/shares/projects/test/1201.txt' -> `/mnt/NAS/test/1201.txt'
`/home/samba/shares/projects/test/test.txt' -> `/mnt/NAS/test/test.txt'
`/home/samba/shares/projects/test/1200.txt' -> `/mnt/NAS/test/1200.txt'
`/home/samba/shares/projects/test/1202/1202.txt' -> `/mnt/NAS/test/1202/1202.txt'
现在我的新基础与旧基础相同,但没有像现实中那样的时间戳我修改了一个文件,添加内容来模拟自从我复制所有内容以来编辑的文件然后我应用您的解决方案:
root@xx:/mnt/NAS/test# cd $old_base; find . -type f | xargs ls -s | sort -k 2,2 >/tmp/old
root@xx:/home/samba/shares/projects/test# cd $new_base; find . -type f | xargs ls -s | sort -k 2,2 >/tmp/new
root@xx:/mnt/NAS# comm -12 /tmp/old /tmp/new | while read size filename; do touch ${new_base}/${filename} -r ${old_base}/${filename}; done
comm: file 2 is not in sorted order
comm: file 1 is not in sorted order
我没有错误,但没有任何变化(我不确定 ${filename} 是什么意思,但我也试图用${new_base}/*
编辑:22/07
当我使用时没有任何结果
comm -12 --nocheck-order /tmp/old /tmp/new
答案1
我接下来的操作概要:将两个层次结构列成一个文件,并指定大小。对大小文件进行排序,并使用“comm -12”进行比较,以提供大小完全相同的文件名列表。然后,您可以生成一个时间戳列表并进行比较,或者只需将该列表输入“touch -r”命令即可复制时间戳。请不要盲目地剪切和粘贴这些命令——确保您了解它们的作用。
除非您有大量文件,否则这不会花费那么长时间。
一些简单的(未经测试的)命令应该有帮助:
old_base = 包含旧文件和所需时间戳的层次结构的基本目录
new_base = 包含新文件的层次结构的基本目录,时间戳不正确
cd $old_base; find . -type f | xargs ls -s | while read size filename; do echo "${filename} ${size}"; done | sort >/tmp/old_list
cd $new_base; find . -type f | xargs ls -s | while read size filename; do echo "${filename} ${size}"; done | sort >/tmp/new_list
尝试执行comm -12 /tmp/old_list /tmp/new_list
并查看输出。如果不是文件名需要更改时间戳,我们需要找出原因。
comm -12 /tmp/old_list /tmp/new_list | while read size filename; do touch ${new_base}/${filename} -r ${old_base}/${filename}; done