Найти файлы, за исключением некоторых каталогов

Найти файлы, за исключением некоторых каталогов

Я работаю со следующей структурой каталогов:

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

Я хочу выполнить команду для всех файлов в каталоге верхнего уровня и в каталогеТестирование. Я не хочу запускать команду для файлов в каталогахИсточникиМодели. Для этого я выполнил следующую команду:

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

В этом примере команда не была запущена ни для одного файла в структуре каталогов.

Когда я выполнил следующую команду для той же структуры каталогов:

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

Я получил следующий результат

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

Как вы видите, я могу запустить одну команду для дерева каталогов и применить ее ко всем файлам, или я могу попытаться сделать это выборочно и не запустить ни для одного файла. Как мне получить выборочное применение нужной мне команды?

решение1

Это можно сделать с помощью Regex из родительского каталога:

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

\./([^/]+|Testing/.*)$найдет все файлы ( -type f) в текущем каталоге и Testingтолько в этом каталоге.

Чтобы выполнить команду, добавьте -execдействие:

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

Замените echoвашей фактической командой.

Пример:

$ 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

Связанный контент