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
-
mindepthemaxdepthvalores de2restringem a pesquisa a diretórios filhos imediatos -
-type ddesigna que você deseja apenas encontrar diretórios -
-name cachediz 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 {} \;
-
-execchama 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:
-
-mindepthe-maxdepthde3só 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.