bash - por - comando find linux recursivo
Excluir un subdirectorio usando find (4)
Tengo una estructura de directorios como esta
data
|___
|
abc
|____incoming
def
|____incoming
|____processed
123
|___incoming
456
|___incoming
|___processed
Hay una subcarpeta entrante en todas las carpetas dentro del directorio de datos. Quiero obtener todos los archivos de todas las carpetas y subcarpetas, excepto los directorios def / entrantes y 456 / entrantes. Probé con el siguiente comando
find /home/feeds/data -type d /( -name ''def/incoming'' -o -name ''456/incoming'' -o -name arkona /) -prune -o -name ''*.*'' -print
pero no está funcionando como se esperaba
Ravi
Esto funciona:
find /home/feeds/data -type f -not -path "*def/incoming*" -not -path "*456/incoming*"
Explicación:
-
find /home/feeds/data
: comienza a buscar recursivamente desde la ruta especificada -
-type f
: buscar solo archivos -
-not -path "*def/incoming*"
: no incluye nada condef/incoming
como parte de su ruta -
-not -path "*456/incoming*"
: no incluye nada con456/incoming
como parte de su ruta
Solo por el bien de la documentación: es posible que tengas que cavar más profundo ya que hay muchas constelaciones de búsqueda (como tenía que hacerlo). Tal vez -not -path
que la prune
es tu amiga, mientras que la -not -path
no hará lo que esperas.
Este es un valioso ejemplo de 15 ejemplos de búsqueda que excluyen directorios:
http://www.theunixschool.com/2012/07/find-command-15-examples-to-exclude.html
Para vincular a la pregunta inicial, excluyendo finalmente funcionó para mí de esta manera:
find . -regex-type posix-extended -regex ".*def/incoming.*|.*456/incoming.*" -prune -o -print
Entonces, si desea encontrar un archivo y aún excluir pathes, simplemente agregue | grep myFile.txt
| grep myFile.txt
.
Puede depender también de tu versión de búsqueda. Ya veo:
$ find -version
GNU find version 4.2.27
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX
-name
solo coincide con el nombre del archivo, no con la ruta completa. Desea utilizar -path
en -path
lugar, para las partes en las que está podando los directorios como def/incoming
.
find $(INP_PATH} -type f -ls |grep -v "${INP_PATH}/.*/"