2

我开始使用 bash-scripting 并且我目前正在编写一个脚本来备份一个目录,如果该目录自上次备份以来被修改过。我正在使用 diff 命令来检查这个,但我想我可能没有正确使用它。

编辑 我得到差异的原因是因为文件 newFile 和 oldFile 是在包含脚本的目录中创建的,这与我要备份的目录相同。如何使用 diff 使其返回除这两个文件之外的差异?

ls -lR $1 > oldFile

while [ 0 ]; 
do

    ls -lR $1 > newFile

    if [ ! diff newFile oldFile ] ; then
  echo "they differ"

else

    echo "they don't differ" 
fi

 done
4

4 回答 4

1

首先,if 语句根本不起作用。利用:

if [ diff oldFile newFile ] ; then
    echo "they differ"
fi

注意[ ]括号!(请注意,它们不是真正的“括号”。[test命令的矮个子,]是它的最后一个参数。疯狂,但很酷!


您可以使用

diff -rN OLD_DIR NEW_DIR

获得递归差异。-N还跟踪新文件

你也可以看看inotifywait和朋友。Inotify 是 Linux 内核中的一种机制,它允许在 inode(文件或目录,...)发生更改时注册挂钩。使用inotifywait(和恶魔),您可以注册一个 shell 脚本,该脚本将在感兴趣的文件/目录上发生的每个文件操作时触发。在该脚本中,您可以在更改后直接进行备份(如果需要)

于 2013-02-03T02:13:29.523 回答
0

一个小的搜索就会发现:Bash:在 if 语句中使用 diff 的结果

DIFF=$(diff newfile oldfile) 
if [ "$DIFF" != "" ]; then
    ...
于 2013-02-03T02:14:33.930 回答
0

您还可以使用md5deep对目录中的文件进行哈希处理,然后对该命令的输出进行哈希处理以获得最终校验和:

hash=$(md5deep -rs folder | md5sum)
于 2013-02-03T02:21:54.587 回答
0

代码中的括号diff不是强制性的,其想法是if语句自己测试后面命令的返回码。所以不用再打电话test了。你也可以写:

if diff -q newFile oldFile &> /dev/null ; then...

(重定向到 /dev/null 在这里是因为 diff返回 - 无用 - 输出)

于 2013-02-03T10:04:01.703 回答