texto recursivo por extension ejemplos consola comando buscar archivos archivo bash unix

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 con def/incoming como parte de su ruta
  • -not -path "*456/incoming*" : no incluye nada con 456/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}/.*/"