![如何将文件时间从一个目录树同步到另一个目录树](https://linux22.com/image/1375358/%E5%A6%82%E4%BD%95%E5%B0%86%E6%96%87%E4%BB%B6%E6%97%B6%E9%97%B4%E4%BB%8E%E4%B8%80%E4%B8%AA%E7%9B%AE%E5%BD%95%E6%A0%91%E5%90%8C%E6%AD%A5%E5%88%B0%E5%8F%A6%E4%B8%80%E4%B8%AA%E7%9B%AE%E5%BD%95%E6%A0%91.png)
我有两个文件树。第一个由原始文件组成。第二个是重复文件,但缺少正确的文件时间戳,它们都设置为上次复制的日期。
是否有一种干净简便的方法可以将文件时间戳从一棵树复制到另一棵树,而无需再次传输文件内容?
补充:两棵树在某些文件中可能略有不同,因为重复是在过去某个时间点生成的。时间戳应在可能时更新。
答案1
您可以尝试:
cd /path/to/old/directory
find . -exec touch "/path/to/new/directory/{}" --reference "{}" \;
touch --reference someotherfile
用作为参考来更改文件的日期和时间someotherfile
。
如果两棵树相同,则 {} 部分将扩展为两棵树中的同一个文件,新目录前缀将完成其余工作。您可以使用echo
而不是touch
来验证是否正在遍历正确的文件。
当然,这会touch
为每个文件执行一个进程。也许 Python 脚本会更高效。
答案2
一个简短的 Python 脚本就可以完成:
#!/usr/bin/python
import os
import sys
for directory,subdirs,files in os.walk('.'):
pathes=subdirs+files
for path in pathes:
fullpath=os.path.join(directory,path)
target_path=os.path.join(sys.argv[1],fullpath)
mtime=os.lstat(fullpath).st_mtime
print 'touching',target_path,':',
try:
os.utime(target_path,(mtime,mtime))
print 'OK'
except:
print 'FAILED'
它必须在源目录中运行,并将目标目录作为唯一参数,例如:
python ~/sync_tstamps.py /path/to/target_dir
答案3
尝试使用rsync
及其--size-only
选项。
rsync -avi --size-only A/ B/
这应该只检查文件的大小并更新时间戳。