我正在编写一个简单的 Bash 脚本来检测文件夹是否被修改。
这种情况非常接近:
ls -lR $dir > a ls -lR $dir > b DIFF=$(diff a b) if [ $DIFF -ne 0 ] then echo "The directory was modified"
遗憾的是,if 语句输出一个错误: [ :-ne: unary 操作符预期
我不知道我的剧本出了什么问题,有人能帮帮我吗?
非常感谢!
杰瑞
您要查找的是 diff的返回值,而不是示例代码中使用的 diff的输出。
diff
试试这个:
diff a b if [ $? -ne 0 ]; then echo "The directory was modified"; fi
if ! diff -q a b &>/dev/null; then >&2 echo "different" fi
ls -lR $dir > a ls -lR $dir > b DIFF=$(diff a b) if [ "$DIFF" != "" ] then echo "The directory was modified" fi
DIFF=$(diff -u <(find dir1/ -type f -printf '%P\n' | sort) <(find dir2/ -type f -printf '%P\n' | sort)) if [ "$DIFF" ]; then echo "Directories differ" # Do other stuff here fi
这使用了我最喜欢的抨击方法之一,<()进程替换。
<()
$DIFF变量保存可打印的差异。如果您想向最终用户显示它,一定要双引号,例如 echo "$DIFF"。
$DIFF
echo "$DIFF"
如果你只想告诉用户有 任何的差异,如果可以缩短到类似 [ "$(diff ...)" ] && echo "Difference found"的东西
[ "$(diff ...)" ] && echo "Difference found"
注意 : 我假设最初的问题意味着使用 dir1和 dir2来使问题更有意义。如果在时间0是 dir,然后在时间1是 dir,这种方法显然不会起作用。
dir1
dir2
dir
如果您不需要知道更改是什么,那么 cmp就足够了。 另外,你还可以使用 &&和 ||提供的句法技巧:
cmp
&&
||
cmp a b || echo 'The directory was modified'
该指示可解释为: “要么 a 和 b 相等,要么 i 重复消息”。
(&&和 ||的语义必须小心处理,但在这里它是直观的)。
为了便于阅读,我想写成两行:
cmp a b \ || echo 'The directory was modified'