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?

bash  find 

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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.