Obteve menos resultado com a opção print0 na localização?

10

Eu li a página de manual e outras referências, mas ainda estou confuso com o comportamento de encontrar com a -print0opção.

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

Primeiro 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

Percebo que os nomes dos arquivos do segundo comando estão separados por caracteres nulos, mas por que recebo 3 resultados em oposição aos 5 acima?

Precursor
fonte
1
Tecnicamente, são nulos terminados , não nulos separados. (Há uma NUL depois de cada caminho, incluindo a última.)
CJM

Respostas:

12

Seu primeiro exemplo

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

não é 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 sua expressão contém outra ação -purge, a impressão implícita não é mais adicionada. Você quer

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

O motivo pelo qual você está recebendo apenas três nomes de arquivos é que esses são os que correspondem à sua segunda condição (a que possui uma ação). O que você digitou realmente significa

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

O que espero esclarecer por que apenas 1 lado imprime alguma coisa.

cjm
fonte
Para sua informação, você pode simplificar a expressão find com: find /some/path -iregex '.*intro.*\.jpe?g'... e como agora existe apenas uma expressão, ela evitará o problema destacado por cjm.
cas
@cjm os parênteses salvaram meu dia, eu consertei um bug de 0 dia no meu script !!!
Leesei 28/08/2015
@mltsy não é confuso, sua expressão regular ;-).
Leesei 28/08/2015