Exclure un sous-répertoire utilisant find

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

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

Il existe un sous-dossier entrant dans tous les dossiers du répertoire Data. Je veux obtenir tous les fichiers de tous les dossiers et sous-dossiers, à l’exception des 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

Cela marche:

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

Explication:

  • find /home/feeds/data : commence à rechercher de manière récursive à partir du chemin spécifié
  • -type f : rechercher des fichiers uniquement
  • -not -path "*def/incoming*" : -not -path "*def/incoming*" aucun élément avec def/incoming dans son chemin
  • -not -path "*456/incoming*" : ne pas inclure quelque chose avec 456/incoming dans son chemin

Juste pour des raisons de documentation: vous devrez peut-être creuser plus profondément car il y a beaucoup de constellations de search’n’skip (comme je devais le faire). Il se peut que prune soit votre ami alors que -not -path ne fera pas ce que vous attendez.

Voici donc 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 lier à la question initiale, exclure finalement travaillé pour moi comme ceci:

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

Ensuite, si vous souhaitez rechercher un fichier et toujours exclure les chemins, ajoutez simplement | grep myFile.txt | grep myFile.txt .

Cela peut aussi 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 

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

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