Bash:在if语句中使用diff的结果

时间:2010-08-31 18:02:04

标签: bash diff

我正在编写一个简单的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:一元运算符预期

我不确定我的剧本有什么问题,请有人帮助我吗?

非常感谢!

Jary

5 个答案:

答案 0 :(得分:45)

if ! diff -q a b &>/dev/null; then
  >&2 echo "different"
fi

答案 1 :(得分:41)

ls -lR $dir > a
ls -lR $dir > b

DIFF=$(diff a b) 
if [ "$DIFF" != "" ] 
then
    echo "The directory was modified"
fi

答案 2 :(得分:25)

您正在寻找diff的返回值,而不是您在示例代码中使用的diff的输出。

试试这个:

diff a b
if [ $? -ne 0 ]; then
    echo "The directory was modified";
fi

答案 3 :(得分:1)

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 "Difference found"

注意:我假设原始问题意味着让dir1dir2更有意义。如果在时间0时为dir,在时间1时为dir,则此方法显然不起作用。

答案 4 :(得分:0)

如果您不需要知道所做的更改,那么cmp就足够了。 另外,您还可以使用和||提供的语法技巧:

cmp a b || echo 'The directory was modified'

该指令可以解释为: “ a和b相等,或者我回显该消息。”

&&||的语义必须谨慎处理,但这很直观)。

仅出于可读性考虑,我实际上更喜欢将其放在两行:

cmp a b \
  || echo 'The directory was modified'