フォルダーが変更されたことを検出する単純な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:単項演算子が必要です
私のスクリプトの何が問題なのかわかりません。誰か助けてください。
どうもありがとうございました!
ヤリー
ls -lR $dir > a
ls -lR $dir > b
DIFF=$(diff a b)
if [ "$DIFF" != "" ]
then
echo "The directory was modified"
fi
if ! diff -q a b &>/dev/null; then
>&2 echo "different"
fi
サンプルコードで使用しているdiff
の出力ではなく、diff
の戻り値を探しています。
これを試して:
diff a b
if [ $? -ne 0 ]; 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
_
これは、私のお気に入りのバシズムの1つである<()
プロセス置換を使用します。
_$DIFF
_変数には、印刷可能な差があります。エンドユーザーに表示する場合は、二重引用符で囲んでください。 _echo "$DIFF"
_。
ユーザーにanyの違いのみを伝えたい場合は、[ "$(diff ...)" ] && echo "Difference found"
のように短縮できる場合
注:私は、元の質問が_dir1
_と_dir2
_を持っていることを意味していると仮定して、もう少し理にかなっています。時間0でdir
であり、時間1でdir
だった場合、このアプローチは明らかに機能しません。
変更内容を知る必要がない場合は、cmp
で十分です。さらに、and ||
によって提供される構文上のトリックで遊ぶことができます:
cmp a b || echo 'The directory was modified'
命令は、「aとbが等しいか、メッセージをエコーする」と解釈されます。
(&&
と||
のセマンティックは注意して処理する必要がありますが、ここでは直感的です)。
読みやすくするために、実際には2行に配置することを好みます。
cmp a b \
|| echo 'The directory was modified'