как включить команду find для печати разницы состояния exe с 0, когда команда поиска не находит файл?
согласно моему примеру, когда я пытаюсь найти файл test1.txt, $? установлен в 0, но я ожидаю получить значение diff от 0, потому что файл не найден
[root@om-1 tmp]# touch test.txt
[root@om-1 tmp]# find /var/tmp -name test.txt
/var/tmp/test.txt
[root@om-1 tmp]# echo $?
0
[root@om-1 tmp]# find /var/tmp -name test1.txt (test1.txt not under /var/tmp)
[root@om-1 tmp]# echo $?
0
Вы не можете.
Из find
страница руководства:
EXIT STATUS
find exits with status 0 if all files are processed successfully,
greater than 0 if errors occur. This is deliberately
a very broad description, but if the return value is non-zero,
you should not rely on the correctness of the results of find.
Статус выхода 0
просто говорит: мне удалось обработать все файлы без ошибок (например, проблемы с разрешением).
Одно решение:
COUNT=`find / -type f -name "thisfiledoesnnotexist" -print | wc -l`
ECHO $COUNT
0
В то время как locate возвращает 1, если файл не найден в базе данных
Попробуйте следующее условие оболочки:
[ "$(find /var/tmp -name test.txt)" ] && echo Found || echo Not found
что в основном то же самое, что:
[ "$(find /var/tmp -name test.txt)" '!=' '' ] && echo Found || echo Not found
В обоих случаях статус выхода find должен быть равен нулю, потому что команда find не завершилась ошибкой. В случае, если он не нашел совпадений, он просто существует в обычном режиме без вывода на печать.
В качестве обходного пути вы можете использовать что-то вроде:
if [ `find . -name test1.txt | grep test1.txt | wc -l` -eq 0 ] ; then echo 1 ; else echo 0; fi
Однако я не уверен в результате в случае ошибки.
Использует find
обязательно для вас? Вы точно знаете, где должен быть какой-нибудь файл? Тогда например
stat /var/tmp/test.txt; echo $?
stat /var/tmp/test1.txt; echo $?
должен работать на вас.