Exclure le répertoire dans la recherche


11

Comment puis-je trouver chaque fichier et répertoire correspondant à un modèle, à l'exception d'un répertoire utilisant find?

Disons que j'ai la structure de fichiers suivante;

.
  foo-exclut-moi /
    foo.txt
  foo-exclure-moi-pas /
    foo.txt
  bar/
    foo.txt
    foobar /
      bar.txt
      foofoo.txt

comment pourrais-je obtenir la sortie suivante en utilisant find:

./bar/foo.txt
./bar/foobar
./bar/foobar/foofoo.txt
./foo-exclude-me-not
./foo-exclude-me-not/foo.txt

J'ai essayé d'utiliser les deux commandes suivantes:

trouver . -name 'foo-exclude-me' -prune -o -name 'foo *'
trouver . -nom 'foo *' \! -path './foo-exclude-me/*'

mais tous les deux renvoient ceci:

./bar/foo.txt
./bar/foobar
./bar/foobar/foofoo.txt
./foo-exclude-me # << this should be excluded
./foo-exclude-me-not
./foo-exclude-me-not/foo.txt

Comment puis-je exclure correctement le foo-exclude-merépertoire?


Essayez d'utiliser foo-exclude-meau lieu de ./foo-exclude-me. Essayez également d'ajouter -printà la fin de la commande.
n0pe

@MaxMackie perfect :)
Tyilo

Il l'a réparé? Quelle a été la solution qui a fonctionné pour vous? Je peux le mettre dans une réponse au lieu d'un commentaire.
n0pe

@MaxMackie utilisant les deux -printet foo-exclude-meau lieu de ./foo-exclude-me.
Tyilo

Génial, on dirait que Gilles m'a battu mais :)
n0pe

Réponses:


11
find . -name 'foo-exclude-me' -prune -o -name 'foo*' -print

Dans le cas contraire -print, l'action implicite par défaut s'applique à chaque correspondance, même à celles élaguées. L'explicite -printne s'applique que dans les conditions spécifiées, qui -name 'foo*'ne se trouvent que dans la branche else de -name 'foo-exclude-me'.

De manière générale, utilisez un explicite -printchaque fois que vous faites quelque chose de plus complexe qu'une conjonction de prédicats.

Votre deuxième tentative avec ! -path './foo-exclude-me/*'n'a pas fonctionné car ./foo-exclude-mene correspond pas ./foo-exclude-me/*(pas de fin /). L'ajout ! -path ./foo-exclude-mefonctionnerait.


-2
-bash-4.1 $ find. -exec ls -l {} + -name 'a.out' -prune -o -name '*' -exec rm -f {} + -exec ls -l {} +

-rw-r - r--. 1 oradba dba 499 18 janvier 19:30 ./a.out
-rw-r - r--. 1 oradba dba 499 18 janv. 20:59 ./b.out
-rw-r - r--. 1 oradba dba 499 18 janvier 20:59 ./c.out
-rw-r - r--. 1 oradba dba 499 18 janv. 20:59 ./d.out

.:
16 au total
-rw-r - r--. 1 oradba dba 499 18 janvier 19:30 a.out
-rw-r - r--. 1 oradba dba 499 18 janv.20 20:59 b.out
-rw-r - r--. 1 oradba dba 499 18 janv.20 20:59 c.out
-rw-r - r--. 1 oradba dba 499 18 janv.20 20:59 d.out
rm: impossible de supprimer `. ': est un répertoire
ls: impossible d'accéder à ./b.out: aucun fichier ou répertoire de ce type
ls: impossible d'accéder à ./d.out: aucun fichier ou répertoire de ce type
ls: impossible d'accéder à ./c.out: aucun fichier ou répertoire de ce type
.:
total 4
-rw-r - r--. 1 oradba dba 499 18 janvier 19:30 a.out


Utilisé l'option prune pour ignorer a.out et fonctionne correctement
art.s

Vous n'expliquez absolument pas pourquoi -pruneest pertinent. -pruneest l'une des options les plus compliquées à findprovoquer car elle est désactivée -print(qui est activée par défaut)
grochmal

-prune True; si le fichier est un répertoire, n'y descendez pas. - Il ne fonctionnera donc pas lui-même dans les répertoires comme protection. - art.s
user211226
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.