Bash脚本 - 确定文件是否已修改?

时间:2011-01-14 21:26:41

标签: macos bash

我有一个Bash脚本,每隔5秒就会重复复制一次文件。但这是一种过度杀伤,因为通常没有变化。

我知道Linux命令watch,但是这个脚本将在OS X计算机上使用(没有watch,我不想让每个人都安装macports)我需要能够使用直接Bash代码检查文件是否被修改。

我应该检查文件修改时间吗?我怎么能这样做?

编辑:我希望扩展我的脚本,而不仅仅是复制文件,如果它检测到更改。那么有一种纯粹的bash方式吗?

4 个答案:

答案 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)

OS X具有stat命令。这样的东西应该给你一个文件的修改时间:

stat -f '%m' filename

GNU等价物将是:

stat --printf '%Y\n' filename

答案 2 :(得分:3)

通过比较文件大小(如果大小不同,内容不同)和内容的散列,您可能会发现检测文件内容更改更为可靠。您为此目的使用的哈希值可能无关紧要:SHA1甚至MD5可能已经足够,您可能会发现cksum命令就足够了。

文件修改时间可以在不改变内容的情况下改变(想想touch file);即使内容有效,文件修改时间也不会改变(这样做更难,但您可以使用touch -r ref-file file将修改时间file设置为在编辑文件后匹配ref-file

答案 3 :(得分:0)

没有。您应该使用rsync或其中一个前端来复制文件,因为它会检测文件是否不同,只有在文件不同时才复制它们。