2014-01-21 3 views
0

Я замаскировал страницу руководства для поиска, и -quit, кажется, частично выполняет то, что я хочу, за исключением того, что это приведет только к тому, что find будет возвращать ненулевое значение, если произошла ошибка. Итак, как можно заставить find возвращать ненулевое значение или, по крайней мере, подделываться, возвращая ненулевое значение, которое может быть доступно для поддерживающих? До сих пор у меня этот пример:find: Как заставить ненужный статус выхода

$ find . -maxdepth 2 -type f \(-exec echo {} \; -o \(-printf "FAIL\n" -a -quit \) \) 
./scooby 
./shaggy 
./velma 
./daphne 
./fred 
$ echo $? 
0 

Но если я заменю эхо с вызовом ложными, я получаю желаемый ранний выход, но не код ненулевой выходы:

$ find . -maxdepth 2 -type f \(-exec false {} \; -o \(-printf "FAIL\n" -a -quit \) \) 
FAIL 
$ echo $? 
0 

Обновления:

Я пытаюсь найти find, чтобы вернуть ненулевое значение, когда -exec возвращает false, т.е. команда, которая выполняла, возвратила ненулевое значение. В настоящее время find просто преобразует ненулевой вызов -exec в логическое состояние, которое будет использоваться как часть выражения find.

$ find . -maxdepth 2 -type f \(-exec chmod a+x {} \; -o \(-printf "FAIL\n" -a -quit \) \) 

В настоящее время он не будет возвращать ненулевое значение, если сбой chmod. Я хочу, чтобы иметь возможность возвращать ненулевое значение, если chmod не удается, а также выйти раньше, что он уже делает, используя -quit.

+0

Чего вы пытаетесь достичь (путем возврата ненулевого кода выхода)? – devnull

+0

У меня есть вопрос. – Craig

+0

Итак, цель выхода рано, когда 'chmod' терпит неудачу или есть еще больше? – devnull

ответ

2

Если вы хотите всегда возвращать код выхода ненулевого, используйте && false, как показано ниже:

find . -maxdepth 2 -type f ... && false 

Использование grep искать специальный FAIL строки напечатанной find. Он будет возвращать ноль, если exec потерпел неудачу, в противном случае - ноль.

$ find . -maxdepth 2 -type f \(-exec chmod a+x {} \; -o \(-printf "FAIL\n" -a -quit \) \) | grep -q "FAIL" 
+0

Я не 'всегда 'хочу выйти из ненулевого, только при определенных условиях. – Craig

+0

Вы можете использовать 'grep' для поиска строки' FAIL'. – dogbane

+0

Это было в конвейере, но это не так чисто. Он также требует 'set -o pipefail' для того, чтобы он работал с' set -e' – Craig

0

Я думаю, что это не очень хорошая идея, чтобы злоупотребить код выхода из find сформулировать результат. Это предотвратит стандартный способ сообщения об ошибках find (например, ошибки ввода-вывода, отказ в разрешении и т. Д.).

Я думаю, вы действительно должны использовать какой-то вывод find, чтобы указать результат и проверить его.

rm ./findResult 2>/dev/null 
find /path/to/my/dir -name '*my*pattern*' -fprintf ./findResult "fail" -quit 
result=$(cat ./findResult 2>/dev/null || echo "success") 

Таким образом, у вас есть общий способ возврата значений (не только 8 бит int, но и произвольных строк). С другой стороны, с помощью кода выхода будут даже обнаружены ошибки, обнаруженные find.

Смежные вопросы