Я работаю со следующей структурой каталогов:
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