Назад | Перейти на главную страницу

команда find + статус exec отличается от 0, если файл не найден

как включить команду 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 $?

должен работать на вас.