Chcę, aby mój bash wypisał „znaleziono” tylko wtedy, gdy coś zostanie znalezione, za pomocą polecenia find. Ale użycie && nie pomaga: nawet jeśli nic nie znalazłem, drukuje się „znaleziono”. Przykład:
$ pwd
/data/data/com.termux/files/home/test/test1/test4
$ ls
xaa xab
$ find . -name xac && echo 'found'
found
$ find . -name xaa && echo 'found'
./xaa
found
command-line
find
Josef Klimuk
źródło
źródło
/some/path
mówi, od czego zacząć, ale nic nie mówi, czego szukać. To samo w połączonej odpowiedzi. Co dla mnie działafind /some/path -name xac -print0 -quit | grep -qz . && echo found
. Przegapiłem coś?-print0 -quit
. To, co umieścisz wcześniej, zależy od tego, co chcesz znaleźć. Zdecydowałem się to tutaj pominąć.Odpowiedź muru jest odpowiednia i dobrze nadaje się do przypadków, w których chcemy coś wydrukować, jeśli plik zostanie znaleziony. W ogólnym przypadku, gdy chcemy wykonać polecenie zewnętrzne, np.
echo
Możemy użyć-exec
flagi.{}
Część przechodzi pliku do polecenia pomiędzy-exec
i\;
jako argumenty. Zauważ, że\
przed;
- zapobiega powłoki z misinterpreting go; w muszli zamykania oznacza rednikami końca polecenia, ale gdy uciekł z kreską, powłoka będzie traktować go jako tekst literall być przekazane dofind
polecenia i znaleźć polecenie służy jako zamknięcie-exec
argumenty bandery.Do konstruowania tego
if found do this; else do that
rodzaju warunków możemy użyć podstacji polecenia$()
itest
polecenia (aka[
):Zwracając się do komentarza Dana
Dan w komentarzach zapytał:
Najpierw zrozummy problem. Zwykle w powłokach występuje koncepcja podziału słów, co oznacza, że niecytowane zmienne i parametry pozycyjne będą rozszerzane i traktowane jako osobne elementy. Na przykład, jeśli masz zmienną
var
i zawierahello world
tekst, gdy zrobisztouch $var
powłoka będzie rozbicie go na dwie odrębne pozycjehello
iworld
itouch
zrozumie, że tak, jakbyś próbował utworzyć 2 oddzielne pliki; jeśli to zrobisztouch "$var"
, powłoka będzie traktowanahello world
jako jedna jednostka itouch
utworzy tylko jeden plik. Ważne jest, aby zrozumieć, że dzieje się tak tylko z powodu działania powłok.W przeciwieństwie do tego,
find
nie cierpi z powodu takiego zachowania, ponieważ polecenia są przetwarzane przezfind
siebie i wykonywane przezexecvp()
wywołanie systemowe, więc nie ma w tym żadnej powłoki. Podczas gdy nawiasy klamrowe mają specjalne znaczenie w powłokach, ponieważ pojawiają się w środkufind
polecenia, a nie na początku, w tym przypadku nie mają specjalnego znaczenia dla powłoki. Oto przykład. Utwórzmy kilka trudnych nazw plików i spróbuj przekazać je jako argument dostat
polecenia.Jak widać,
stat
doskonale odbiera trudne nazwy plikówfind
, co jest jednym z głównych powodów, dla których jest zalecane do użycia w przenośnych skryptach, a szczególnie przydatne, gdy przeglądasz drzewo katalogów i chcesz zrobić coś z nazwami plików, które mogą mieć znaki specjalne w nich. Dlatego nie jest konieczne cytowanie nawiasów klamrowych dla poleceń wykonywanych wfind
.To inna historia, kiedy angażuje się Shell. Czasami musisz użyć powłoki do przetworzenia nazwy pliku. W takim przypadku cytowanie będzie miało znaczenie, ale ważne jest, aby zdawać sobie sprawę, że nie ma problemu ze znalezieniem - to powłoka dzieli słowa.
Więc kiedy cytujemy w powłoce , to zadziała. Ale znowu, to ważne dla powłoki, nie
find
.źródło
echo "I found {}"
byłoby lepiej niżecho "I found " {}
? Może dla echa jest w porządku, ale jeśli ktoś skopiuje polecenie i zastąpi echo innym poleceniem, może mieć problem.