Odpowiedzi:
Oto jedna linijka, która moim zdaniem robi to, co chcesz:
find /tmp -name something | egrep '.*'
Status zwracany będzie, 0
gdy coś zostanie znalezione, a w przeciwnym razie niezerowy.
Jeśli musisz także uchwycić wyniki find
do dalszego przetwarzania, odpowiedź Svena to pokryła.
find ... | read
Najprostsze rozwiązanie, które nie drukuje, ale wychodzi 0 po znalezieniu wyników
find /tmp -name something | grep -q "."
Wyjście 0 jest łatwe do znalezienia, wyjście> 0 jest trudniejsze, ponieważ zwykle dzieje się tak tylko z błędem. Jednak możemy to zrobić:
if find -type f -exec false {} +
then
echo 'nothing found'
else
echo 'something found'
fi
find
nie zależy od kodów wyjścia -exec
uruchomionych przez niego programów .
exec
sekcji, a nie pod wartością zwracaną). Nie potrafi rozróżnić niczego, co nie zostało znalezione, i popełnił błąd (np. Gdy został wywołany w nieistniejącym punkcie początkowym).
Po znalezieniu tego pytania podczas próby rozwiązania problemu z Puppet (zmiana uprawnień do folderów w katalogu, ale nie do samego katalogu), wydaje się, że działa:
! test -z $(find /tmp -name something)
Mój konkretny przypadek użycia jest następujący:
! test -z $(find /home -mindepth 1 -maxdepth 1 -perm -711)
Który zakończy kod 1, jeśli polecenie find nie znajdzie plików z wymaganymi uprawnieniami.
To nie jest możliwe. Znajdź zwraca 0, jeśli zakończy się pomyślnie, nawet jeśli nie znalazł pliku (co jest poprawnym wynikiem, nie oznacza błędu, gdy plik rzeczywiście nie istnieje).
Cytując znalezioną stronę podręcznika
STATUS WYJŚCIA
znajdź wyjścia ze statusem 0, jeśli wszystkie pliki zostaną pomyślnie przetworzone, większe niż 0, jeśli wystąpią błędy. Jest to celowo bardzo szeroki opis, ale jeśli zwracana wartość jest różna od zera, nie należy polegać na poprawności wyników wyszukiwania.
W zależności od tego, co chcesz osiągnąć, możesz spróbować znaleźć -print
nazwę pliku i przetestować na podstawie wyniku:
#!/bin/bash
MYVAR=`find . -name "something" -print`
if [ -z "$MYVAR" ]; then
echo "Notfound"
else
echo $MYVAR
fi
exec
/ execdir
(używane z +
):If any invocation returns a non-zero value as exit status, then find returns a non-zero exit status.
Uważam, że jest to najbardziej zwięzła i bezpośrednia metoda:
test `find /tmp/ -name something -print -quit 2>/dev/null`
-print -quit
, co może rozwiązać problem.
Oto mały skrypt, który zadzwoniłem test.py
. Poprawia inne metody zamieszczone w tym, że zwróci kod błędu, jeśli jest ustawiony, a dodatkowo ustawia jeden, jeśli find nie wyświetlał żadnych plików:
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)
Oto wynik działania wiersza polecenia:
$ python test.py . -maxdepth 1 -name notthere
$ echo $?
1
$ find . -maxdepth 1 -name notthere
$ echo $?
0
$ find . -failedarg
find: unknown predicate `-failedarg'
$ echo $?
1
Następnie, aby uzyskać wynik, w którym znaleziono błędy, ale znaleziono pliki:
$ 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
Następnie, jeśli chcesz listę plików, możesz skorzystać z -print 0
przekazanej find
i podzielić zmienną out na wartości null lub możesz po prostu dodać dla niej instrukcję print.
Nie tylko find
zwraca kody stanu wyjścia jako zero, gdy się powiedzie. W unixie, cokolwiek polecenie, które wykonasz, jeśli się powiedzie, to zwraca status wyjścia jako zero.
*
naegrep
regex jest całkowicie zbędne. Ponieważ nie używaszegrep
składni wyrażeń regularnych, zwykły starygrep
może być o kilka mikrosekund szybszy.