142 votes

Exclure un sous-répertoire à l'aide de find

La structure de mon répertoire est la suivante

data
|___
   |
   abc
    |____incoming
   def
    |____incoming
    |____processed
   123
    |___incoming
   456
    |___incoming
    |___processed

Il y a un sous-dossier entrant dans tous les dossiers du répertoire Data. Je veux récupérer tous les fichiers de tous les dossiers et sous-dossiers sauf les dossiers def/incoming et 456/incoming. J'ai essayé avec la commande suivante

 find /home/feeds/data -type d \( -name 'def/incoming' -o -name '456/incoming' -o -name arkona \) -prune -o -name '*.*' -print

mais cela ne fonctionne pas comme prévu.

Ravi

245voto

sampson-chen Points 13413

Ça marche :

find /home/feeds/data -type f -not -path "*def/incoming*" -not -path "*456/incoming*"

Explication :

  • find /home/feeds/data : commencer à trouver récursivement à partir du chemin spécifié
  • -type f : trouver uniquement les fichiers
  • -not -path "*def/incoming*" : n'incluez rien avec def/incoming dans le cadre de son parcours
  • -not -path "*456/incoming*" : n'incluez rien avec 456/incoming dans le cadre de son parcours

13voto

peter_the_oak Points 1272

Juste pour le bien de la documentation : Il se peut que vous deviez creuser davantage car il existe de nombreuses constellations de type "search'n'skip" (comme j'ai dû le faire). Il peut s'avérer que prune est votre ami tandis que -not -path ne fera pas ce que vous attendez.

Il s'agit donc d'un exemple précieux de 15 exemples de recherche qui excluent les répertoires :

http://www.theunixschool.com/2012/07/find-command-15-examples-to-exclude.html

Pour faire le lien avec la question initiale, exclure a finalement fonctionné pour moi comme ceci :

find . -regex-type posix-extended -regex ".*def/incoming.*|.*456/incoming.*" -prune -o -print 

Ensuite, si vous souhaitez trouver un seul fichier tout en excluant les chemins d'accès, il suffit d'ajouter | grep myFile.txt .

Cela peut aussi dépendre de votre version de find. Je vois :

$ find -version
GNU find version 4.2.27
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX

5voto

Brian Campbell Points 101107

-name ne correspond qu'au nom du fichier, et non au chemin d'accès complet. Vous voulez utiliser -path au lieu de cela, pour les parties dans lesquelles vous élaguez les répertoires comme def/incoming .

2voto

Vishal Pathak Points 21
find $(INP_PATH} -type f -ls |grep -v "${INP_PATH}/.*/"

2voto

alper Points 265

En suivant la réponse pour Comment exclure un répertoire dans la commande find . :

find . \( -name ".git" -o -name "node_modules" \) -prune -o -print

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X