我正在使用以下目录结构:
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