Відповіді:
Ось однолінійний перехід, який я вважаю, робить те, що ви хочете:
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
s, який він запустив.
exec
розділі, а не під зворотним значенням). Він не може розрізняти нічого, що знайдено, і виявляється, що помиляється (наприклад, коли його викликали на неіснуючій початковій точці).
Щойно знайшовши це питання, намагаючись знайти спосіб вирішити проблему з Лялькою (змінити дозволи для папок під каталогом, але не для самого каталогу), схоже, це працює:
! test -z $(find /tmp -name something)
Мій конкретний випадок використання:
! test -z $(find /home -mindepth 1 -maxdepth 1 -perm -711)
Який вийде з коду 1, якщо команда 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
. Він покращує інші методи, розміщені в тому, що він поверне код помилки, якщо такий встановлений, і він додатково встановить його, якщо знахідка не перерахувала жодних файлів:
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
Потім для результату, де у файлі find були помилки, але знайдені файли:
$ 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
та розділеною змінною на нулі, або ви можете просто додати до неї заяву друку.
Він не тільки find
повертає коди статусу виходу як нуль, коли він успішний. У unix, що коли-небудь команда, яку ви виконуєте, якщо її успішно, то вона повертає статус виходу як нуль.
*
наegrep
регулярній виразці є абсолютно зайвим. Оскільки ви не використовуєтеegrep
синтаксис регулярного вираження, звичайний старийgrep
може пройти на кілька мікросекунд швидше.