Buscar archivos excluyendo algunos directorios

Buscar archivos excluyendo algunos directorios

Estoy trabajando con la siguiente estructura de directorios:

onathan@Aristotle:~/EclipseWorkspaces/ShellUtilities/ShellUtilities$ ls -R
.:
calculateTargetDay  CustomizeIso  ec  makeExecutable  Models  modifyElementList  Sourced  test file  Testing  valrelease

./Models:
testcase

./Sourced:
colors  stddefs  stdFunctions  SupportTesting

./Testing:
test  testCalculateTargetDay  testColors  testModifyElementList  testStddefs  testStdFunctions  testSupportTesting  tst

Lo que quiero hacer es ejecutar un comando en todos los archivos en el directorio de nivel superior y en el directorioPruebas. No quiero ejecutar el comando en los archivos de los directorios.De origenyModelos. Para hacer esto ejecuté el siguiente comando:

find . -name Sourced -prune -name Models -prune ! -name '\.*'  -execdir echo '{}' \;

Este ejemplo no ejecutó el comando en ninguno de los archivos de la estructura del directorio.

Cuando ejecuté el siguiente comando en la misma estructura de directorio:

find . ! -name '\.*'  -execdir echo '{}' \;

Obtuve el siguiente resultado

./calculateTargetDay
./CustomizeIso
./Testing
./testModifyElementList
./test
./testColors
./testStdFunctions
./testCalculateTargetDay
./testStddefs
./testSupportTesting
./tst
./test file
./modifyElementList
./ec
./Sourced
./stdFunctions
./stddefs
./SupportTesting
./colors
./valrelease
./Models
./testcase
./makeExecutable

Como puede ver, puedo ejecutar un comando en el árbol de directorios y hacer que se aplique a todos los archivos o puedo intentar ser selectivo y terminar ejecutándolo sin archivos. ¿Cómo puedo conseguir la aplicación selectiva de un comando que necesito?

Respuesta1

Puedes hacerlo con Regex, desde el directorio principal:

find . -type f -regextype posix-egrep -regex '\./([^/]+|Testing/.*)$'

\./([^/]+|Testing/.*)$encontrará todos los archivos ( -type f) en el directorio actual y Testingsolo en el directorio.

Para ejecutar un comando, agregue -execla acción:

find . -type f -regextype posix-egrep -regex '\./([^/]+|Testing/.*)$' -exec echo {} \;

Reemplace echocon su comando real.

Ejemplo:

$ find . -type f                                                                           
./foo
./Sourced/src
./Testing/test
./bar
./spam
./Models/model

$ find . -type f -regextype posix-egrep -regex '\./([^/]+|Testing/.*)$'                 
./foo
./Testing/test
./bar
./spam

$ find . -type f -regextype posix-egrep -regex '\./([^/]+|Testing/.*)$' -exec echo {} \;
./foo
./Testing/test
./bar
./spam

información relacionada