(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.