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}/.*/"