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?

Tyilo
la source
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.

Gilles 'SO- arrête d'être méchant'
la source
-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

user211226
la source
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