我有一个Bash脚本,每隔5秒就会重复复制一次文件。但这是一种过度杀伤,因为通常没有变化。
我知道Linux命令watch
,但是这个脚本将在OS X计算机上使用(没有watch
,我不想让每个人都安装macports)我需要能够使用直接Bash代码检查文件是否被修改。
我应该检查文件修改时间吗?我怎么能这样做?
编辑:我希望扩展我的脚本,而不仅仅是复制文件,如果它检测到更改。那么有一种纯粹的bash方式吗?
答案 0 :(得分:13)
如果您有大量文件树,我倾向于同意rsync
答案
要管理,但你可以使用-u(--update)标志来复制cp
仅当源比目的地更新时才提交文件。
cp -u
修改强>
由于您已更新问题以表明您愿意接受
一些额外的操作,您将要使用-nt
检查
在[
(test
)内置命令中:
#!/bin/bash
if [ $1 -nt $2 ]; then
echo "File 1 is newer than file 2"
else
echo "File 1 is older than file 2"
fi
从手册页:
file1 -nt file2
True if file1 is newer (according to modification date) than
file2, or if file1 exists and file2 does not.
希望有所帮助。
答案 1 :(得分:6)
答案 2 :(得分:3)
通过比较文件大小(如果大小不同,内容不同)和内容的散列,您可能会发现检测文件内容更改更为可靠。您为此目的使用的哈希值可能无关紧要:SHA1甚至MD5可能已经足够,您可能会发现cksum
命令就足够了。
文件修改时间可以在不改变内容的情况下改变(想想touch file
);即使内容有效,文件修改时间也不会改变(这样做更难,但您可以使用touch -r ref-file file
将修改时间file
设置为在编辑文件后匹配ref-file
。
答案 3 :(得分:0)
没有。您应该使用rsync
或其中一个前端来复制文件,因为它会检测文件是否不同,只有在文件不同时才复制它们。