Если у вас Bash v4 (или выше ), я думаю, вы также можете сделать это с помощью одного цикла, ищущего все *.grid
файлы, плюс один внутренний цикл для всех каталогов, чтобы перечислить, в каких каталогах есть файлы, а в каких не надо. В Bash v4 мы используем одну из его опций, которая обычно отключена.
(
# 'globstar' enables '**' expansions, which instructs
# the shell to search all and below recursively
shopt -s globstar
# Note that '**' is implicitly recursive, no need to specify
# depth. If you do want to specify precise depth, then use a
# '*/' for each wanted depth, like '*/*/*/' for 3 depths
for f in /work/user/folder1/**/*.grid; do
f="${f##*/}" # strip directory from found name
printf '\nNow looking for: %s\n' "$f"
# A simple '**/' returns directories only
for d in /work/user/folder1/**/; do
# simple existence test
[ -e "${d}${f}" ] && \
printf ' present in %s\n' "$d" || \
printf 'not present in %s\n' "$d"
done
done
)
К сожалению, синтаксис **
не соответствует POSIX.
Однако, если вы знаете точную глубину поиска, просто уберите команду shopt
и превратите каждый **/
в точную глубину, выраженную как */
повторений, и это должно хорошо работать и в оболочках POSIX..
Я упрощу и назову вашу строку exec просто «exec», а предшествующие строки (с экспортами )«pre1» и «pre2».
Вы можете «пропустить» две строки в /pre1/, загрузив их в область удержания и выполнив «пустую» командуb
:
sed '/pre1/{N;N;b};/exec/ipre1\npre2'
Таким образом, команда для /exec/
запускается только тогда, когда /pre1/
не соответствует.
Предполагается, конечно, что у вас есть либо
pre1
pre2
exec
или просто
exec
только и никогда "pre1" или "pre2" в другом порядке, только один из них или любой из них где-то еще в файле.