Eu tenho um monte de usuários indisciplinados com contas de email em um servidor meu. Eles nunca esvaziam sua lixeira ou pastas de lixo eletrônico e o número de arquivos sobe até o infinito.
Estou criando um script Bash para apagar esses arquivos periodicamente usando o cron.
Eu fiz isso:
- crie um arquivo txt com uma lista de diretórios que eu quero apagar;
- crie um script que leia linha por linha, todo diretório e apague tudo,
cur
enew
.
Exemplo de arquivo txt:
~/mail/.Junk/cur
~/mail/.Junk/new
~/mail/.Trash/cur
~/mail/. Trash/new
~/mail/[email protected]/.Junk/cur
~/mail/[email protected]/.Junk/new
~/mail/[email protected]/.Trash/cur
~/mail/[email protected]/.Trash/new
~/mail/[email protected]/.Junk/cur
~/mail/. [email protected]/.Junk/new
~/mail/. [email protected]/.Trash/cur
~/mail/. [email protected]/.Trash/new
Estou na primeira fase da criação do script, onde testo se consigo acessar os diretórios e listar seus conteúdos.
Então eu tenho esse script:
#!/bin/bash
while read line
do
ls $line
done < ~/directories.txt
Quando executo o script, recebo o seguinte erro:
ls: não pode acessar ~/mail/[email protected]/.Junk/new/: Não tal arquivo ou diretório
para todos os diretórios, mas se eu digitar
ls ~/mail/[email protected]/.Junk/new/
Funciona bem.
porque?
~
aponta para um diretório home diferente (provavelmente/root
). use caminhos completos e garanta que o root tenha acesso às pastas e ao conteúdo.~
caminho no script para ver se você está no lugar certo e talvez você precise usar o caminho absoluto de sua casa em vez do~
Respostas:
Cite suas variáveis!
while read line
e então fazendols $line
não funciona; você tem que usarls "$line"
para lidar com espaços em branco nas variáveis. Geralmente, cite suas variáveis quando você as usa!Se você não fizer isso, você está fazendo um grande problema ao tentar
rm $line
, se essa linha éEntão se você fez
ls $line
, tentaria listar duas pastas:~/mail
Trash/new
No pior dos casos, se você fez um
rm -rf $line
, você removeria~/mail
completamente ! Então, usels "$line"
dentro do seu loop. E o mesmo pararm
.Na verdade, a maneira mais robusta de ler um arquivo linha por linha e manipular corretamente os espaços em branco é explicado aqui :
o
-r
impede que barras invertidas sejam expandidas eIFS=
ajuda no caso em que uma linha começa ou termina com um espaço em branco, que a casca poderia cortar de outra forma.Não use caminhos que precisam ser expandidos!
Se o seu arquivo de texto contiver caminhos que serão posteriormente expandidos, o caminho será alterado dependendo de quem executa o script. Aqui,
~
será expandido para o caminho inicial do usuário no momento da execução, portanto, se você estiver executando o script comoroot
, vai começar a partir/root
e não da casa do usuário no ponto de criação do arquivo de texto.Portanto, armazene os caminhos completos em seu arquivo.
fonte