At work, we use a software development product (from a company that will remain nameless, but whose name may be considered a synonym for "logical"). The development trees are organized beneath a top directory, let's call it "$rat". The first level under $rat contains the major system names, and at that level there is either the list of subsystems or one additional directory layer then subsystems. I.e., using .1 for subsystems,
$rat
skeletal
protective.1
support.1
ambulatory.1
circulatory
blood
redcells.1
whitecells.1
plasma.1
endocrine.1
dermal
withhair.1
withouthair.1
muscular
ambulatory.1
manipulative.1
sensory
visual
red.1
green.1
yellow.1
olfactory.1
...
Beneath each subsystem, each there are copies of the views for each developer interested in developing there as well as the baselined views of the software. I.e., using .2 for the views,
$rat
skeletal
protective.1
fred.2
barney.2
wilma.2
baseline.2
support.1
fred.2
barney.2
betty.2
baseline.2
...
So fred, barney and wilma do protective skeletal development, while fred, barney and betty do support skeletal development.
Here's the question: Is there a way to write a single "find" expression that will find, for every system, all the source code in betty's view, or (if betty doesn't have a view on the given code) all the source in the baseline view?
The best I've been able to come up with is a two level find:
find $rat -name '*.1' -prune -exec findbetty '{}' |
while read viewname ; do
find $viewname -name '*.[ch]'
done > output.txt
There are a few more clauses in both find commands to reject "logical's" tool-maintaintained directories.
findbetty is a script that does this:
#!/bin/sh
ls -a $1 |
awk -v base=$1 '/betty\.2/ { print base "/" $0 ; found = 1 }
/baseline\.2/ { d = base "/" $0; }
END { if (!found && length(d)) print d }'
I.e., if in the given subsystem ".1" directory, there is a "betty.2", print it, otherwise if there is a "baseline.2", print that.
I'd like to be able to do this in a single "find" command with no calls to external programs.
Ideas?