Pregunta Excluir un subdirectorio usando find


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


76
2017-11-19 19:11


origen


Respuestas:


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 de forma recursiva desde la ruta especificada
  • -type f: buscar solo archivos
  • -not -path "*def/incoming*": no incluya nada con def/incoming como parte de su camino
  • -not -path "*456/incoming*": no incluya nada con 456/incoming como parte de su camino

142
2017-11-19 19:22



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). Podría resultar que prune es tu amigo mientras -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.

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

5
2017-08-04 07:15



-name solo coincide con el nombre del archivo, no con la ruta completa. Quieres usar -path en cambio, para las partes en las que está podando los directorios como def/incoming.


4
2017-11-19 19:16



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

1
2018-01-17 22:12