Ответы:
Вот строчка, которая, как я считаю, делает то, что вы хотите:
find /tmp -name something | egrep '.*'
Статус возврата будет, 0
когда что-то найдено, и ненулевой в противном случае.
Если вам также нужно захватить вывод find
для дальнейшей обработки, то ответ Свена покрыл это.
find ... | read
Самое простое решение, которое не печатает, но выходит 0, когда найдены результаты
find /tmp -name something | grep -q "."
Выход 0 легко найти, выход> 0 сложнее, потому что обычно это происходит только с ошибкой. Однако мы можем сделать это:
if find -type f -exec false {} +
then
echo 'nothing found'
else
echo 'something found'
fi
find
видимому, не зависит от кодов выхода, которые -exec
он запускал.
exec
разделе, а не под возвращаемым значением). Он не может различить ничего не найденного и не обнаруживает ошибки (например, когда он был вызван на несуществующей начальной точке).
После того, как я нашел этот вопрос, пытаясь найти способ решить проблему с Puppet (изменить разрешения для папок в каталоге, но не для самого каталога), похоже, это работает:
! test -z $(find /tmp -name something)
Мой конкретный вариант использования такой:
! test -z $(find /home -mindepth 1 -maxdepth 1 -perm -711)
Который выйдет из кода 1, если команда find не найдет файлы с необходимыми разрешениями.
Это невозможно. Функция Find возвращает 0, если она успешно завершается, даже если она не нашла файл (что является правильным результатом, не указывающим на ошибку, когда файл действительно не существует).
Цитировать страницу поиска
СТАТУС ВЫХОДА
найти выходы со статусом 0, если все файлы успешно обработаны, больше 0 при возникновении ошибок. Это намеренно очень широкое описание, но если возвращаемое значение не равно нулю, вам не следует полагаться на правильность результатов поиска.
В зависимости от того, чего вы хотите достичь, вы можете попытаться найти -print
имя файла и проверить его вывод:
#!/bin/bash
MYVAR=`find . -name "something" -print`
if [ -z "$MYVAR" ]; then
echo "Notfound"
else
echo $MYVAR
fi
exec
/ execdir
(используется с +
):If any invocation returns a non-zero value as exit status, then find returns a non-zero exit status.
Я чувствую, что это самый лаконичный и прямой метод:
test `find /tmp/ -name something -print -quit 2>/dev/null`
-print -quit
, что могло бы решить вашу проблему.
Вот маленький сценарий, который я назвал test.py
. Он улучшает другие методы, опубликованные в том, что он вернет код ошибки, если он установлен, и дополнительно установит один, если find не перечислил никаких файлов:
from subprocess import Popen
import sys
p = Popen(['find'] + sys.argv)
out, err = p.communicate()
if p.returncode:
sys.exit(p.returncode)
if not out:
sys.exit(1)
Вот вывод командной строки:
$ python test.py . -maxdepth 1 -name notthere
$ echo $?
1
$ find . -maxdepth 1 -name notthere
$ echo $?
0
$ find . -failedarg
find: unknown predicate `-failedarg'
$ echo $?
1
Затем, для результата, где поиск имел ошибки, но нашел файлы:
$ ls -lh
$ d--------- 2 jeff users 6 Feb 6 11:49 noentry
$ find .
.
./noentry
find: `./noentry': Permission denied
$ echo $?
1
$ find . | egrep '.*'
.
./noentry
find: `./noentry': Permission denied
$ echo $?
0
python ../test.py
../test.py
$ echo $?
1
Затем, если вам нужен список файлов, вы можете использовать -print 0
переданную find
и разделить переменную out на нули, или вы можете просто добавить для нее оператор печати.
Это не только find
то, что возвращает коды состояния выхода как ноль, когда это успешно. В Unix какую бы команду вы ни выполняли, если она выполнена успешно, она возвращает статус выхода как ноль.
*
наegrep
регулярное выражение полностью излишним. Поскольку вы не используетеegrep
синтаксис регулярных выражений, обычный старыйgrep
может быть на несколько микросекунд быстрее.