Hai meno output con l'opzione print0 su find?


10

Ho letto la pagina man e altri riferimenti, ma sono ancora confuso dal comportamento di 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).

Primo comando:

$ 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

Secondo comando:

$ 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

Vedo che i nomi dei file del secondo comando sono separati da caratteri null, ma perché ottengo 3 output invece di 5 sopra?


1
Tecnicamente, sono nulle terminate , non nulle separate. (C'è un NUL dopo ogni percorso, incluso l'ultimo.)
cjm

Risposte:


12

Il tuo primo esempio

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

non è equivalente a

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

È equivalente a

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

Quando la tua espressione contiene un'azione diversa da -purge, la stampa implicita non viene più aggiunta. Tu vuoi

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

Il motivo per cui stai ottenendo solo 3 nomi di file è che quelli sono quelli corrispondenti alla tua seconda condizione (quella che ha un'azione). Ciò che hai digitato significa davvero

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

Che si spera chiarisca perché solo 1 lato stampa qualcosa.


Cordiali saluti, è possibile semplificare l'espressione find con: find /some/path -iregex '.*intro.*\.jpe?g'... e poiché ora esiste solo un'espressione, si eviterà il problema evidenziato da cjm.
Cas:

@cjm le parentesi mi hanno salvato la giornata, ho corretto un bug di 0 giorni nella mia sceneggiatura !!!
leesei,

@mltsy non è confuso, la sua espressione regolare ;-).
leesei,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.