web-dev-qa-db-fra.com

Exclure un sous-répertoire en utilisant find

J'ai une structure de répertoire comme celle-ci

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 de données. Je veux obtenir tous les fichiers de tous les dossiers et sous-dossiers sauf les répertoires 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

100
Ravi

Cela marche:

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

Explication:

  • find /home/feeds/data: commence à rechercher récursivement à partir du chemin spécifié
  • -type f: recherche de fichiers uniquement
  • -not -path "*def/incoming*": ne rien inclure dans def/incoming dans le cadre de son parcours
  • -not -path "*456/incoming*": ne rien inclure dans 456/incoming dans le cadre de son parcours
184
sampson-chen

Juste pour des raisons de documentation: vous devrez peut-être creuser plus profondément car il existe de nombreuses constellations search'n'skip (comme ce fut le cas pour moi). Il se peut que Prune soit votre ami alors que -not -path ne fera pas ce que vous attendez.

Il s'agit donc d'un exemple précieux de 15 exemples trouvés excluant des répertoires:

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

Pour créer un lien vers la question initiale, l'exclusion a finalement fonctionné pour moi comme suit:

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

Ensuite, si vous souhaitez rechercher un fichier tout en excluant les chemins, ajoutez simplement | grep myFile.txt.

Cela peut également dépendre de votre version de recherche. Je vois:

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

-name ne correspond qu'au nom de fichier, pas à tout le chemin. Vous voulez utiliser -path _ à la place, pour les parties dans lesquelles vous élaguez les répertoires comme def/incoming.

5
Brian Campbell
find $(INP_PATH} -type f -ls |grep -v "${INP_PATH}/.*/"
1
Vishal Pathak