Haben Sie weniger Ausgabe mit der Option print0 beim Suchen?

10

Ich habe die Manpage und andere Referenzen gelesen, bin aber immer noch verwirrt über das Verhalten von find with -print0option.

-print0      This primary always evaluates to true.  It prints the pathname of
             the current file to standard output, followed by an ASCII NUL
             character (character code 0).

Erster Befehl:

$ find /some/path/ -iname "*intro*jpeg" -o -iname "*intro*jpg" 2> /dev/null
/some/path//asdf199Intro-5kqlw.jpeg
/some/path/199intro-2jjaj.JPEG
/some/path/199intro-3.jpg
/some/path/wuer199intro-4.JPG
/some/path/xbzf199INTRO-1.jpg

Zweiter Befehl:

$ find /some/path/ -iname "*intro*jpeg" -o -iname "*intro*jpg" 2> /dev/null -print0
/some/path/136intro-3.jpg/some/path/wuer136intro-4.JPG/some/path/xbzf136INTRO-1.jpg

Ich kann sehen, dass die Dateinamen des zweiten Befehls durch Nullzeichen getrennt sind, aber warum erhalte ich 3 Ausgaben im Gegensatz zu 5 oben?

Vordenker
quelle
1
Technisch gesehen , sie sind null beendet , nicht null getrennt. (Es gibt eine NUL nach jedem Pfadnamen, einschließlich des letzten.)
cjm

Antworten:

11

Dein erstes Beispiel

 find /some/path/ -iname "*intro*jpeg" -o -iname "*intro*jpg"

ist nicht gleichbedeutend mit

 find /some/path/ -iname "*intro*jpeg" -o -iname "*intro*jpg" -print

Es ist äquivalent zu

 find /some/path/ \( -iname "*intro*jpeg" -o -iname "*intro*jpg" \) -print

Wenn Ihr Ausdruck eine andere Aktion als enthält -purge, wird der implizite Druck nicht mehr hinzugefügt. Sie wollen

find /some/path/ \( -iname "*intro*jpeg" -o -iname "*intro*jpg" \) -print0 2> /dev/null

Der Grund, warum Sie nur 3 Dateinamen erhalten, ist, dass diese mit Ihrer zweiten Bedingung übereinstimmen (derjenigen, die eine Aktion hat). Was Sie eingegeben haben, bedeutet wirklich

find /some/path/ \( -iname "*intro*jpeg" \) -o \( -iname "*intro*jpg" -print0 \)

Was hoffentlich klar macht, warum nur 1 Seite etwas druckt.

cjm
quelle
Zu Ihrer Information, Sie können den find /some/path -iregex '.*intro.*\.jpe?g'Suchausdruck vereinfachen mit: ... und da es nur noch einen Ausdruck gibt, wird das von cjm hervorgehobene Problem vermieden.
Cas
@cjm die Klammern haben meinen Tag gerettet, ich habe einen 0-Tage-Fehler in meinem Skript behoben !!!
Leesei
@mltsy es ist nicht verwirrend, sein regulärer Ausdruck ;-).
Leesei