Gibt es ein idiomatisches Mittel, um festzustellen, ob "find" Übereinstimmungen gefunden hat? Ich benutze gerade
COUNT=`find ... | wc -l`
if [ "$COUNT" -gt 0 ]; then
aber das scheint mir ein wenig indirekt zu sein. Außerdem möchte ich, dass find aufhört zu suchen, sobald es eine Übereinstimmung gefunden hat, damit es keine Zeit und Mühe verschwendet. Ich muss nur wissen, ob Dateien vorhanden sind, die übereinstimmen.
Update: Ich habe den Fehler gemacht, meine Frage ohne den Code vor mir zu schreiben: Ich verwende wc -l
in einem anderen Fall, in dem ich die Gesamtzahl der gefundenen Dateien ohnehin kennen muss. In dem Fall, in dem ich nur prüfe, ob Übereinstimmungen vorhanden sind, habe ich verwendet if [ -z $(find …) ]
.
-n
nur für 'definierte' Variablen ($ abc, $ xyz usw.), aber ich nehme an, dass $ (...) eine 'definierte' temporäre Variable ist. +1 ... (und ich nur Lesen Sie kürzlich, dass die Verwendung von-n
riskant ist, es sei denn, Sie sind sich sicher, dass die Variable noch nicht deklariert wurde und nicht verwendet wird. uninitialized vs. empty-n
ob eine Zeichenkette leer ist, es hat nichts mit Variablen zu tun. Was Sie gelesen haben, war wahrscheinlich, dass die Verwendung-n
nicht testet, ob eine Variable definiert ist:-n "$foo"
ist falsch, wennfoo
definiert, aber leer, und zeigt eine Fehlermeldung unterset -u
.[ -n "${foo+1}" ]
testet zuverlässig, obfoo
gesetzt, aber leere und nicht gesetzte Variablen identisch zu behandeln, ist normalerweise eine gute Idee:[ -n "${foo:+1}" ]
oder nur,[ -n "$foo" ]
wenn Sie sich keine Sorgen machenset -u
.-quit
verfügbar, aber Piping-to-head -n 1
Works (wie auchhead -c 1
, was noch früher aufhört, aber wahrscheinlich mit vernachlässigbarem Nutzen). Außerdem habe ich den Fehler gemacht, meine Frage ohne den Code vor mir zu schreiben: Ich verwendewc -l
in einem anderen Fall, in dem ich die Gesamtzahl der gefundenen Dateien kennen muss. In dem Fall, in dem ich nur prüfe, ob Übereinstimmungen vorhanden sind, habe ich verwendetif [ -z `find … ` ]
.Mit der
-quit
Aktion können Sie nach dem ersten Spiel anhalten. Sie werden das wahrscheinlich mit einer anderen Aktion (wie-print
) kombinieren wollen oder Sie werden nicht in der Lage sein zu sagen, ob sie etwas gefunden hat.Zum Beispiel
find ... -print -quit
wird der Pfad der ersten übereinstimmenden Datei gedruckt und dann beendet. Oder Sie können-printf 1 -quit
1 drucken, wenn es eine Übereinstimmung gibt, und nichts, wenn es keine gibt.find
Der Beendigungsstatus gibt an, ob bei der Suche Fehler aufgetreten sind und nicht, ob etwas gefunden wurde. Sie müssen daher die Ausgabe überprüfen, um festzustellen, ob eine Übereinstimmung vorliegt.quelle
-quit
ist eine GNU-Erweiterung. Es funktioniert nicht auf Systemen, die andere Implementierungen von find (1) verwenden, z. B. OS X, BSDs und wahrscheinlich die meisten kommerziellen Unices.Exit 0 ist mit find einfach, Exit> 0 ist schwieriger, weil das normalerweise nur mit einem Fehler passiert. Wie auch immer, wir können es schaffen:
Beachten Sie, dass diese Lösung leistungsfähiger ist als die Verwendung einer Subshell. false auszuführen ist sicherlich schneller als sogar Dash auszuführen:
quelle
Sie können es in den Shell-Zustand einwickeln, zB:
Wo
...
ist Ihre Matchbedingung, z-name *.txt
.Einige andere Beispiele:
quelle