A maneira mais POSIX de fazer isso é provavelmente usar o comando find
com várias opções -exec
.
Atualização: Uma solução totalmente POSIX está no final deste post.
Você pode localizar diretórios aninhados denominados "cache" sob o caminho /home/demo
da seguinte forma:
find /home/demo -mindepth 2 -maxdepth 2 -type d -name cache
-
mindepth
emaxdepth
valores de2
restringem a pesquisa a diretórios filhos imediatos -
-type d
designa que você deseja apenas encontrar diretórios -
-name cache
diz para retornar apenas correspondências que são nomeadas exatamente como "cache"
Você pode usar a opção -exec
para executar ações com base nos resultados correspondentes. Por exemplo, se você quisesse executar ls
para listar o conteúdo de cada diretório de cache correspondente:
find /home/demo -mindepth 2 -maxdepth 2 -type d -name cache -exec ls {} \;
-
-exec
chama o seguinte comando que o segue (ls
) para cada correspondência -
{}
retorna o valor da correspondência (nesse caso, o caminho para o diretório de cache) -
\;
diz para executar o comando uma vez para cada partida
Portanto, se você quiser excluir o conteúdo do diretório, poderá substituir o comando ls
acima por uma instrução rm
apropriada - algo como sh -c 'rm "{}"/*'
Exemplo (NÃO EXECUTE ISSO):
find /home/demo -maxdepth 2 -mindepth 2 -type d -name cache -exec sh -c 'rm "{}"/* 2>/dev/null' \;
No exemplo acima, sh -c
é usado para permitir a expansão do shell do /*
para corresponder aos arquivos aninhados (isso não é muito POSIX). Você poderia adicionar outro -exec
para criar um arquivo adicional.
Exemplo (NÃO EXECUTE ISSO):
find /home/demo -maxdepth 2 -mindepth 2 -type d -name cache -exec sh -c 'rm "{}"/* 2>/dev/null' \; -exec touch "{}/index.html" \;
No exemplo acima, duas opções -exec
são usadas juntas. O segundo, que cria um arquivo index.html
aninhado, só é executado se o primeiro comando -exec
for concluído com êxito.
Talvez seja melhor dividir isso em vários comandos de localização: um para corresponder e remover os arquivos e outro para criar o index.html
.
Exemplo (NÃO EXECUTE ISSO):
find /home/demo -mindepth 3 -maxdepth 3 -wholename "/home/demo/*/cache/*" -exec rm -rf "{}" \;
find /home/demo -maxdepth 2 -mindepth 2 -type d -name cache -exec touch "{}/index.html" \;
Na primeira declaração:
-
-mindepth
e-maxdepth
de3
só correspondem a filhos de crianças -
-wholename "/home/demo/*/cache/*"
fornece uma correspondência para filhos dos diretórios de cache de destino
A segunda instrução cria os arquivos index.html
.
Se eu entendi sua pergunta corretamente, então esse par de comandos provavelmente faz o que você está procurando. Mas leia com atenção e certifique-se de entender completamente antes de usá-lo.
Eu recomendo prefixar os comandos rm
e touch
com o comando echo
antes de executar qualquer coisa. Isso deve permitir que você tenha uma corrida a seco para ver o que está fazendo.
Exemplo (execução segura usando echo
):
find /home/demo -mindepth 3 -maxdepth 3 -wholename "/home/demo/*/cache/*" -exec echo rm -rf "{}" \;
find /home/demo -maxdepth 2 -mindepth 2 -type d -name cache -exec echo touch "{}/index.html" \;
Update - Solução totalmente POSIX (mas mais difícil de ler):
Para um equivalente totalmente POSIX (sem mindepth
/ maxdepth
/ wholename
) você pode usar uma combinação -path
positiva / negativa usando a globulação interna de find
.
É significativamente mais fácil se você cd
em sua árvore de trabalho primeiro, já que você não terá que contar os principais diretórios para seus padrões glob.
cd /home/demo
find . -path "./*/cache/*" ! -path "./*/*/*/*" -exec echo rm -rf {} \;
find . -type d -path "./*/cache" ! -path "./*/*/*" -exec echo touch {}/index.html \;
Remova as instruções echo
se obtiver o resultado esperado.