我正在编写一个简单的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
答案 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"
注意:我假设原始问题意味着让dir1
和dir2
更有意义。如果在时间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'