(Sua pergunta não está clara: se um diretório contiver some.foo e some.bar , ele deve ser excluído? Eu interpretei isso exigindo que esse diretório seja mantido.)
O script a seguir deve funcionar, desde que nenhum nome de arquivo contenha uma nova linha e nenhum diretório corresponda a *.foo . O princípio é percorrer o diretório das folhas para cima ( -depth ) e, como arquivos *.foo são encontrados, o diretório que o contém e todos os pais são marcados como protected . Qualquer arquivo atingido que não seja *.foo e não protegido é um diretório a ser excluído. Devido à ordem de passagem -depth , um diretório é sempre alcançado após os arquivos *.foo que podem protegê-lo. Aviso: minimamente testado, remova o echo por sua conta e risco.
find . -depth -name '*.foo' -o -type d | awk '{
if ($0 ~ /\.foo$/) {
while (sub("/+[^/]+$", "")) {protect[$0]=1;}
} else {
if (!protect[$0]) {
gsub("[\find . -depth -name '*.foo' -o -type d | awk '{
if ($0 ~ /\.foo$/) {
while (sub("/+[^/]+$", "")) {protect[$0]=1;}
} else {
if (!protect[$0]) {
gsub("[\%pre%1-/]", "\\&"); # protect file names for xargs
print;
}
}
}' | xargs echo rm -rf
1-/]", "\\&"); # protect file names for xargs
print;
}
}
}' | xargs echo rm -rf
Pela primeira vez, não estou propondo uma solução zsh.