¿Tienes menos resultados con la opción print0 en find?

10

He leído la página de manual y otras referencias, pero todavía estoy confundido por el comportamiento de buscar con -print0opción.

-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).

Primer 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

Segundo 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

Puedo ver que los nombres de archivo del segundo comando están separados por caracteres nulos, pero ¿por qué obtengo 3 resultados en lugar de los 5 anteriores?

Forethinker
fuente
1
Técnicamente, son nulos terminados , no nulos separados. (Hay un NUL después de cada nombre de ruta, incluido el último.)
cjm

Respuestas:

12

Tu primer ejemplo

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

no es equivalente a

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

Es equivalente a

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

Cuando su expresión contiene cualquier otra acción que no sea -purge, la impresión implícita ya no se agrega. Usted quiere

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

La razón por la que solo obtienes 3 nombres de archivo es que esos son los que coinciden con tu segunda condición (la que tiene una acción). Lo que escribiste realmente significa

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

Lo que con suerte deja en claro por qué solo 1 lado imprime algo.

cjm
fuente
Para su información, puede simplificar la expresión de búsqueda con: find /some/path -iregex '.*intro.*\.jpe?g'... y dado que ahora solo hay una expresión, evitará el problema resaltado por cjm.
cas
@cjm los paréntesis me salvaron el día, ¡arreglé un error de 0 días en mi script!
leesei
@mltsy no es confuso, su expresión regular ;-).
leesei