encontrar todos os diretórios com o mesmo nome e remover todo o conteúdo em centos

0

Eu tenho 100 sites no meu servidor Eu quero limpar todas as pastas de cache do joomla. Eu preciso de um comando para fazer isso:

1 - encontre todos os diretórios com o nome "cache"

se eu procurar, por exemplo, no diretório "/ home / demo /"

encontre o diretório "cache" no máximo um nível mais profundo, como:

/home/demo/ddf3e/

/home/demo/awda2/

Não é mais profundo que isso

2 - limpe todos os arquivos & diretórios dentro dos diretórios do "cache"

Apenas o conteúdo a remover não é o próprio

3 - crie um arquivo "index.html" em todos os diretórios do "cache"

Obrigado antecipadamente

    
por HamidZ 11.09.2016 / 11:51

2 respostas

1

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 e maxdepth valores de 2 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 de 3 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.

    
por 11.09.2016 / 19:07
2

Então, se eu acertei, você quer encontrar, e. /home/demo/foo/cache para todos os valores de foo . Como você não precisa olhar em níveis mais profundos, é bastante simples.

(1) Você pode listá-los com um shell glob:

$ cd /home/demo
$ echo */cache

Para proteger contra nomes engraçados como aqueles que começam com um traço ( -foo ), é melhor usar ./* . Além disso, no bash, você também pode fazer o glob incluir nomes começando com um ponto usando shopt -s dotglob .

(2) Encontre e apague os arquivos dentro dos diretórios (com o GNU find, -mindepth 1 impede que ele corresponda aos diretórios):

$ shopt -s dotglob
$ find ./*/cache -mindepth 1                          # list them
./awda2/cache/foo
[...]
$ find ./*/cache -mindepth 1 -delete                  # delete them...

Você também pode usar apenas rm , mas com uma quantidade enorme de arquivos, você pode passar do limite para o tamanho da linha de comando.

$ rm -r ./*/cache/*

(3) Crie ou copie um arquivo para todos eles ( touch cria um arquivo vazio):

$ for dir in ./*/cache ; do touch "$dir/index.html" ; done
$ for dir in ./*/cache ; do cp index.html.model  "$dir/index.html" ; done

(Se houver um arquivo (não diretório) chamado cache , você terá um erro inofensivo sobre isso.)

    
por 11.09.2016 / 18:16

Tags