Je dois exclure .git
de ma find
recherche. Pour y parvenir, j'utilise le -path ./.git -prune
commutateur:
$ find . -path ./.git -prune -o \( -type f -o -type l -o -type d \) | grep '.git'
./.git
Cependant, même si cela ignore le contenu du répertoire .git, il répertorie le répertoire lui-même. Ça marche quand j'ajoute-path ./.git -prune -o -print -a
find . -path ./.git -prune -o -print -a \( -type f -o -type l -o -type d \) | grep '.git'
Pourquoi est-ce nécessaire? Je pensais que les deux commandes devraient avoir la même sortie. La deuxième syntaxe est assez moche.
-print
, sinon l'implicite-print
s'applique à l'ensemble de la conditionRéponses:
La
man
page pourfind
donne:Donc, dans le premier exemple, ce n'est pas le cas, ce qui
-path ./.git -prune
est faux et donc l'action par défaut (-print
) ne serait pas appelée, donc la ligne est imprimée.la source
J'étais confus quant à la raison pour laquelle les répertoires élagués étaient également imprimés par la
find
commande et certains autres détails complexes sur la façon dont cela-prune
fonctionnait, mais j'ai pu le comprendre avec quelques exemples.Pour exécuter les exemples ci-dessous, créez les répertoires et fichiers suivants.
Pour créer cette structure:
Utilisez maintenant find pour rechercher les répertoires nommés
aa
. Pas de problème ici.Recherchez tous les répertoires autres que aa et nous obtenons le répertoire actuel
.
et./bb
, ce qui est également logique.Jusqu'à présent, tout va bien, mais lorsque nous l'utilisons
-prune
, find renvoie le répertoire que nous élaguons, ce qui m'a d'abord dérouté car je m'attendais à ce qu'il renvoie tous les autres répertoires et non celui en élagage.La raison pour laquelle il retourne le répertoire en cours d'élagage est expliquée, non pas dans la
-prune
section des pages de manuel comme indiqué dans la réponse de Timo , mais dans laEXPRESSIONS
section:ce qui signifie que, puisque l'expression correspond au
aa
nom du répertoire, alors l'expression sera évaluée à true et elle sera imprimée car find ajoute implicitement un-print
à la fin de la commande entière.-print
Cependant, cela n'ajoutera pas un si vous ajoutez vous-même l'action-o -print
à la fin:Ici, la commande find N'ajoute
-print
plus d' implicite , donc le répertoire que nous élaguons (aa
) ne sera pas imprimé.Donc, enfin, si nous ajoutons une clause qui recherche des fichiers avec un modèle de
file*
nom de fichier après le-o
, alors vous devez mettre un-print
à la fin de cette deuxième clause comme ceci:La raison pour laquelle cela fonctionne est la même: si vous ne mettez pas de a
-print
dans la deuxième clause, alors comme il n'y a aucune action autre que l'-prune
action, find ajoutera-print
automatiquement un à la FIN de la commande, provoquant l'-prune
impression de la clause répertoire élagué:En général, vous devez placer la
-print
commande dans la deuxième clause. Si vous le placez au milieu comme l'a fait l'affiche originale, cela ne fonctionnera pas correctement car les fichiers en cours d'élagage seront imprimés immédiatement et la deuxième clause n'aura pas la possibilité de choisir les fichiers souhaités:Donc, malheureusement, l'affiche originale a mal reçu la commande ci-dessus en plaçant
-print
le mauvais endroit. Cela pourrait avoir fonctionné pour son cas spécifique, mais cela ne fonctionne pas dans le cas général.Il y a des milliers de personnes qui ont du mal à comprendre comment ça
-prune
marche. Lafind
page de manuel doit être mise à jour afin d'éviter la confusion mondiale sans fin à propos de cette commande.la source
find-4.6.0
) dit: "Si l'expression entière ne contient aucune action autre que -prune ou -print, -print est effectuée sur tous les fichiers pour lesquels l'expression entière est vraie." Mais fonctionne comme vous le décrivez.de la
man
page,Donc, vous pouvez peut-être utiliser:
Cela ne répertorie pas le
.git
répertoire.pour spécifier un nom de fichier, vous pouvez faire comme ceci:
Veuillez noter l'
,
opérateur virgule.la source
Voici une alternative rapide et sale:
Je ne me souviens tout simplement pas de
find
la syntaxe complexe de ...la source