Ответ 1
ls -lR $dir > a
ls -lR $dir > b
DIFF=$(diff a b)
if [ "$DIFF" != "" ]
then
echo "The directory was modified"
fi
Я пишу простой Bash script для обнаружения, когда папка была изменена.
Это нечто очень близкое:
ls -lR $dir > a
ls -lR $dir > b
DIFF=$(diff a b)
if [ $DIFF -ne 0 ]
then
echo "The directory was modified"
К сожалению, оператор if выводит сообщение об ошибке: [: -ne: ожидаемый ожидаемый оператор
Я не уверен, что не так с моим script, сможет ли кто-нибудь помочь мне?
Большое спасибо!
Джари
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
В этом случае используется один из моих любимых bashisms, подстановка процесса <()
.
Переменная $DIFF
содержит разницу в печати. Если вы хотите показать его конечному пользователю, не забудьте дважды его процитировать, например. echo "$DIFF"
.
Если вы хотите только сообщить пользователю, что есть какая-либо разница, если его можно сократить до примерно [ "$(diff ...)" ] && echo "Difference found"
Примечание. Я предполагаю, что исходный вопрос должен иметь dir1
и dir2
, чтобы иметь немного больше смысла. Если он был dir
в момент времени 0, а затем dir
в момент времени 1, этот подход, очевидно, не сработает.
Если вам не нужно знать, что это за изменения, достаточно cmp
. Кроме того, вы можете играть с синтаксическим трюком, предоставленным и ||
:
cmp a b || echo 'The directory was modified'
Инструкция может быть интерпретирована как: "либо a и b равны, либо я повторяю сообщение".
(С семантикой &&
и ||
нужно обращаться осторожно, но здесь она интуитивно понятна).
Просто для удобства чтения я предпочитаю поместить его в две строки:
cmp a b \
|| echo 'The directory was modified'