Відповіді:
Ось однолінійний перехід, який я вважаю, робить те, що ви хочете:
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начебто не залежить від кодів виходу будь-якого -execs, який він запустив.
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може пройти на кілька мікросекунд швидше.