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
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 parcoursJuste 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
-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
.
find $(INP_PATH} -type f -ls |grep -v "${INP_PATH}/.*/"