Quelle est la différence entre trouver. et trouve . -impression


27

Quelle est la différence entre:

find .

et

find . -print

Que fait-il -printréellement?

$ find .
.
./hello.txt
./hello
./hello/txt
./hello/hello2
./hello/hello2/hello3
./hello/hello2/hello3/txt
./hello/hello2/txt
$ find . -print
.
./hello.txt
./hello
./hello/txt
./hello/hello2
./hello/hello2/hello3
./hello/hello2/hello3/txt
./hello/hello2/txt

Réponses:


41

Depuis la findutils findpage de manuel :

Si aucune expression n'est donnée, l'expression -printest utilisée (mais vous devriez probablement envisager de l'utiliser à la -print0place, de toute façon).

( -printest une findexpression.)

La documentation POSIX le confirme:

Si aucune expression n'est présente, -print doit être utilisé comme expression.

find .Est donc exactement équivalent à find . -print; le premier n'a pas d'expression et -printest donc ajouté en interne.

L'explication de ce -printqui se passe se trouve plus loin dans la page de manuel:

-print

Vrai; imprimer le nom de fichier complet sur la sortie standard, suivi d'une nouvelle ligne. Si vous transférez la sortie de find dans un autre programme et qu'il y a la moindre possibilité que les fichiers que vous recherchez contiennent une nouvelle ligne, alors vous devriez sérieusement envisager d'utiliser l' -print0option à la place de -print. Consultez la section NOMS DE FICHIERS INHABITUELS pour plus d'informations sur la façon dont les caractères inhabituels dans les noms de fichiers sont traités.


Une sorte de question de niveau débutant, mais de quelle expression parlez-vous? est cette expression régulière?
Rishi Prakash

2
@Rishi voir la page de manuel .
Stephen Kitt

20

-printest l' action par défaut . Certains findprédicats sont considérés comme des actions et non comme des filtres ou des conditions . Par exemple, ce -type fn'est pas une action.-execest une action même si elle peut également être utilisée comme condition.

Les actions incluent -print, -execet -ok. Certaines findmises en œuvre ont d' autres actions non standard prédicats comme le -print0, -printf, -execdir, -okdir, -ls...

find files <some-predicates>

Lorsqu'aucune action<some-predicates> contient n'est équivalente à:

find files \( <some-predicates> \) -print

(notez les parenthèses ci-dessus qui sont importantes s'il y en a -o opérateurs).

En cas de doute, le mieux est d'utiliser -printexplicitement (ou -exec printf '%s\0' {} +(ou -print0si disponible) afin que la sortie puisse être post-traitée).

L' -printaction par défaut est spécifiée par POSIX. Certaines anciennes findimplémentations nécessitaient une explicite-print , mais celles-ci ne sont généralement pas trouvées dans la nature de nos jours.

Notez également que certaines findimplémentations permettent d'omettre le files, auquel cas elles recherchent par défaut le répertoire courant. Autrement dit, pour eux,

find

est équivalent à

find .
find . -print

Ce n'est cependant pas standard, il est donc préférable d'éviter.

À l'extrémité la plus prolixe (et utile) du spectre, certaines findimplémentations permettent également de passer des chemins de fichier comme argument à une -foption comme dans:

find -f "$file1" -f "$file2" -print

Ce sont les seules findimplémentations qui permettent de passer des chemins de fichiers arbitraires à find. D'autres implémentations ne peuvent pas accepter les chemins de fichiers comme !ou -print... donc find "$file" -print(ou même find -- "$file" -print) suppose que ce $filen'est pas le nom d'unfind prédicat (ou option dans le premier cas).

Malheureusement, ce n'est pas non plus standard ni portable.


S'il n'est pas standard et qu'il vaut mieux l'éviter, pourquoi le nommer?
Isaac

@Isaac, car ils peuvent être pratiques / sont des fautes de frappe possibles ...
vonbrand

8

Ils sont identiques, ils écrivent tous les deux la hiérarchie complète du répertoire à partir du répertoire courant.

Depuis POSIX, recherchez la documentation :

Les commandes suivantes sont équivalentes:

trouver .

trouver . -impression


4

Sous Linux, il n'y a pas de différence, mais d'autres systèmes (comme AIX par exemple) en ont besoin -printsi vous voulez que la sortie de la commande s'affiche sur votre écran.


3
Ce serait alors des versions très très anciennes d'AIX. AIX 4.3 findn'en a pas besoin. AIX est conforme à POSIX depuis des décennies.
Stéphane Chazelas

3

Pendant de nombreuses années, la commande find n'a pas eu d'action par défaut. Une erreur courante oubliait d'ajouter l'option -print à votre commande find. À ce jour, je le tape encore par habitude.

Mais à un moment donné, il a été ajouté comme action par défaut maintenant find .et find . -printest équivalent.


1

Il est parfois utile d'utiliser -printexplicitement lorsque vous effectuez une autre action afin que le nom de fichier s'affiche lorsque cette action est effectuée.

find . -print -delete

serait similaire à

rm -rfv *

-printcorrespond à -v. Si vous n'incluez pas-print les noms de fichiers ne sont pas affichés.

Afin de rendre la rmcommande encore plus similaire, au fait, émettez d'abord cette commande Bash

shopt -s dotglob

ce qui rendra les *fichiers de points (cachés) correspondants.

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.