Vous avez moins de sortie avec l'option print0 sur find?

10

J'ai lu la page de manuel et d'autres références, mais je suis toujours confus par le comportement de find avec -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).

Première commande:

$ 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

Deuxième commande:

$ 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

Je peux voir que les noms de fichiers de la deuxième commande sont séparés par des caractères nuls, mais pourquoi ai-je 3 sorties au lieu de 5 ci-dessus?

Prévoyant
la source
1
Techniquement, ils sont terminés par null , pas séparés par null. (Il y a un NUL après chaque chemin, y compris le dernier.)
cjm

Réponses:

12

Votre premier exemple

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

n'est pas équivalent à

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

C'est équivalent à

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

Lorsque votre expression contient une action autre que -purge, l'impression implicite n'est plus ajoutée. Tu veux

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

La raison pour laquelle vous n'obtenez que 3 noms de fichiers est que ceux-ci correspondent à votre deuxième condition (celle qui a une action). Ce que vous avez tapé signifie vraiment

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

Ce qui, nous l'espérons, montre clairement pourquoi un seul côté imprime quoi que ce soit.

cjm
la source
Pour info, vous pouvez simplifier l'expression de recherche avec: find /some/path -iregex '.*intro.*\.jpe?g'... et comme il n'y a plus qu'une seule expression, cela évitera le problème mis en évidence par cjm.
cas
@cjm les parenthèses ont sauvé ma journée, j'ai corrigé un bug de 0 jour dans mon script !!!
leesei
@mltsy ce n'est pas déroutant, son expression régulière ;-).
leesei