Подтвердить что ты не робот

Bash: используя результат diff в выражении if

Я пишу простой 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, сможет ли кто-нибудь помочь мне?

Большое спасибо!

Джари

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

Вы ищете возвращаемое значение diff, а не вывод diff, который вы используете в своем примере кода.

Попробуйте следующее:

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

Ответ 4

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, этот подход, очевидно, не сработает.

Ответ 5

Если вам не нужно знать, что это за изменения, достаточно cmp. Кроме того, вы можете играть с синтаксическим трюком, предоставленным и || :

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

Инструкция может быть интерпретирована как: "либо a и b равны, либо я повторяю сообщение".

(С семантикой && и || нужно обращаться осторожно, но здесь она интуитивно понятна).

Просто для удобства чтения я предпочитаю поместить его в две строки:

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