Est-ce que -print est une option inutile pour find now?

7

Je viens d'essayer:

find . -name "*.[hc]" -print

et

find . -name "*.[hc]"

Mais les deux sorties identiques, est -printinutile maintenant?


la source

Réponses:

15

En regardant la page de manuel sous FreeBSD, je vois:

 -print  This primary always evaluates to true.  It prints the pathname of
         the current file to standard output.  If none of -exec, -ls,
         -print0, or -ok is specified, the given expression shall be
         effectively replaced by ( given expression ) -print.

Donc, dans de nombreux cas, -printest inutile. Cependant, considérons cette expression qui recherche un fichier nommé à l' foointérieur de somedir, mais pas à l'intérieur d'un répertoire nommé .snapshot:

find somedir -name .snapshot -prune -o -name foo

Compte tenu de la description référencée ci-dessus, cela sera transformé en:

find somedir ( -name .snapshot -prune -o -name foo ) -print

Ce qui n'est pas le même que ce qui était probablement prévu:

find somedir -name .snapshot -prune -o -name foo -print

Ajouter des parenthèses pour rendre le groupe un peu plus évident, c'est:

find somedir ( -name .snapshot -prune ) -o ( -name foo -print )

Pour repérer la différence, remarquez-le -pruneet -printévaluez-le true. Donc, sans spécifier -print, la première version imprimera le fichier actuel s'il correspond ou non .-name .snapshot-name foo

La deuxième version ne sortira le fichier actuel que si elle -name foocorrespond.

C’est une façon longue de dire que cela -printn’est généralement pas nécessaire tant que vous comprenez les situations dans lesquelles cela est nécessaire.

alsacs
la source
C'était d'ailleurs amusant. Je n'avais pas compris les subtilités de cela avant. Merci, locale!
larsks
@ larsks, ça veut dire quoi This primary always evaluates to true?
@locale: exactement ce qu'il dit. findest un énorme évaluateur d’expression logique, et certains de ses prédicats ont des effets secondaires et renvoient une valeur booléenne.
Ignacio Vazquez-Abrams
Vous donnez findun tas d'expressions booléennes - comme -name foo, qui sont évaluées à True lorsqu'un fichier est nommé foo. Les expressions aiment -printou -prunene spécifient pas vraiment une condition, elles sont donc toujours évaluées sur True.
larsks
@ larsks, pourquoi ne pas simplement utiliser -printcar ils sont toujours évalués true, n'est-ce pas en double?
0

C'est également utile lorsque vous faites d'autres choses, mais que vous voulez tout de même voir les correspondances.

Ceci est un appel de script commun pour moi:

find . -name '*somepattern*' -print -delete
Rich Homolka
la source