Czy istnieje idiomatyczny sposób wykrycia, czy „znajdź” znalazł jakieś dopasowania? Obecnie używam
COUNT=`find ... | wc -l`
if [ "$COUNT" -gt 0 ]; then
ale wydaje mi się to trochę pośrednie. Ponadto chciałbym znaleźć, aby przestał szukać, gdy znajdzie pasujący element, więc nie marnuje czasu i wysiłku. Muszę tylko wiedzieć, czy są jakieś pasujące pliki.
Aktualizacja: Popełniłem błąd, pisząc moje pytanie bez kodu przede mną: używam wc -l
w innym przypadku, w którym i tak muszę znać całkowitą liczbę znalezionych plików. W przypadku, gdy testuję tylko, czy są jakieś dopasowania, użyłem if [ -z $(find …) ]
.
-n
dotyczy tylko zmiennych „zdefiniowanych” ($ abc, $ xyz itp.), Ale przypuszczam, że $ (...) jest „zdefiniowaną” zmienną temp. +1 ... (i po prostu ostatnio czytałem, że używanie-n
jest ryzykowne, chyba że masz pewność, że zmienna nie została już zadeklarowana i jest „nieużywana)… ale temp nie będzie miał takiej możliwości… niezainicjowany kontra pusty-n
sprawdza, czy łańcuch jest pusty, nie ma to nic wspólnego ze zmiennymi. To, co przeczytałeś, prawdopodobnie powiedziało, że użycie-n
nie sprawdza, czy zmienna jest zdefiniowana:-n "$foo"
jest fałszywe, jeślifoo
jest zdefiniowane, ale puste, i wyświetla komunikat o błędzie podset -u
.[ -n "${foo+1}" ]
niezawodnie sprawdza, czyfoo
jest ustawiony, ale identyczne traktowanie pustych i nieuzbrojonych zmiennych jest zwykle dobrym pomysłem:[ -n "${foo:+1}" ]
lub po prostu,[ -n "$foo" ]
jeśli się nie martwiszset -u
.-quit
dostępnego, ale przesyłanie strumieniowe dohead -n 1
działa (tak jak tohead -c 1
, co zatrzymuje się nawet wcześniej, ale prawdopodobnie z nieistotną korzyścią). Popełniłem też błąd, pisząc moje pytanie bez kodu przede mną: używamwc -l
w innym przypadku, w którym muszę znać całkowitą liczbę znalezionych plików. W przypadku, gdy testuję tylko, czy są jakieś dopasowania, użyłemif [ -z `find … ` ]
.Możesz użyć
-quit
akcji, aby zatrzymać po pierwszym meczu. Prawdopodobnie będziesz chciał połączyć to z inną akcją (jak-print
), inaczej nie będziesz w stanie stwierdzić, czy coś znalazło.Na przykład
find ... -print -quit
wydrukuje ścieżkę pierwszego pasującego pliku, a następnie zakończy działanie. Lub możesz użyć-printf 1 -quit
do wydrukowania 1, jeśli jest dopasowanie i nic, jeśli nie ma.find
Status wyjścia odzwierciedla, czy podczas wyszukiwania wystąpiły błędy, a nie czy coś znalazł, więc musisz sprawdzić jego wynik, aby sprawdzić, czy istnieje dopasowanie.źródło
-quit
jest rozszerzeniem GNU. Nie będzie działać na systemach wykorzystujących inne implementacje find (1), takich jak OS X, BSD i prawdopodobnie większość komercyjnych Unices.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ć:
Zauważ, że to rozwiązanie jest bardziej wydajne niż użycie podpowłoki; wykonanie false jest z pewnością szybsze niż wykonanie nawet Dasha:
źródło
Możesz owinąć go w stan powłoki, np .:
Gdzie
...
jest twój warunek dopasowania, np-name *.txt
.Kilka innych przykładów:
źródło