Tem menos saída com opção print0 no find?

10

Eu li a man page e outras referências, mas ainda estou confuso com o comportamento de encontrar com a opção -print0 .

-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

Eu posso ver que os nomes de arquivos do segundo comando são separados por caractere nulo, mas por que recebo 3 saídas em oposição a 5 acima?

    
por Forethinker 29.09.2012 / 18:27

1 resposta

11

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 qualquer ação diferente de -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á obtendo apenas 3 nomes de arquivos é que esses são aqueles que correspondem à sua segunda condição (aquela que tem uma ação). O que você digitou realmente significa

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

Que, esperamos, deixa claro por que apenas um lado imprime qualquer coisa.

    
por 29.09.2012 / 18:35

Tags