Excluir automaticamente arquivos com mais de 7 dias

17

Eu sou um noob completo no linux, mas estou começando a pegar o jeito. Eu tenho um Ubuntu Server 16.04 executando um servidor FTP para fazer backup de arquivos de vídeo de segurança. Os arquivos serão armazenados em pastas como: /home/securityfolder1, /home/securityfolder2, /home/securityfolder3e assim por diante.

Observe que cada securityfolderNum é um usuário diferente.

Como não quero que meus discos rígidos estejam cheios o tempo todo, desejo excluir arquivos com mais de 7 dias nessas pastas diariamente.

Jacco van de Wijgaart
fonte
/homegeralmente contém uma subpasta para cada usuário. Se você não deseja armazenar seus backups como usuários diferentes (não é uma boa ideia), considere outro local, por exemplo, /home/security/backup1e assim por diante.
Melebius
@ Melebius obrigado pelo seu comentário, cada pasta / security é um usuário diferente, esqueci de mencionar isso.
Jacco van de Wijgaart

Respostas:

26

Primeiro, este comando encontrará e excluirá todos os arquivos com mais de 7 dias em qualquer subdiretório /homecujo nome comece por securityuser:

find /home/securityuser* -mtime +6 -type f -delete

Você precisa -mtime +6e não +7porque -mtimeconta períodos de 24 horas. Conforme explicado na -atimeseção de man find( -mtimefunciona da mesma maneira):

   -atime n
          File  was  last  accessed n*24 hours ago.  When find figures out
          how many 24-hour periods ago the file  was  last  accessed,  any
          fractional part is ignored, so to match -atime +1, a file has to
          have been accessed at least two days ago.

Portanto, para encontrar um arquivo que foi modificado há 7 ou mais dias, é necessário encontrar arquivos que foram modificados há mais de 6 dias -mtime +6.

O próximo passo é executar esse comando uma vez por dia. Como cada securityuserNum é um usuário diferente (convém repensar essa configuração, isso torna tudo mais complicado), isso deve ser executado como root. Então edite /etc/crontab:

sudo nano /etc/crontab

E adicione esta linha:

@daily root find /home/securityuser* -mtime +6 -type f -delete

Isso executará o findcomando uma vez por dia e excluirá os arquivos.

Terdon
fonte
+1 Aproximando um pouco mais as unhas e talvez reiterando a sugestão de Melebius para o OP, que find '/home/securityuser/*' -mtime +6 -type f -delete(com todas as alterações pertinentes e apropriadas na criação do usuário) geralmente pode ser uma ideia melhor do que find '/home/securityuser*' -mtime +6 -type f -delete(sem barra) ...?
Cbhihe
@ CBhihe não, os diretórios de destino são chamados /home/securityuserN, portanto, sem a barra, eles não serão encontrados.
terdon
sim, vi isso; apenas não achei boas práticas por parte do OP (criar um usuário separado para cada vídeo de segurança, etc.) ao longo do primeiro comentário de Melebius, mesmo que o OP possa ter suas razões para fazê-lo. Se alguma coisa o meu comentário foi manco, não uma crítica à sua resposta boa e completa.
Cbhihe
11
+1 de mim. Apenas observe um detalhe enquanto eu o executava no RHEL: o curinga não funcionou no caminho. Eu tive que colocá-lo no -name:find /home/ -name 'securityuser*' -mtime +6 -type f -delete
Stelios Adamantidis
11
@SteliosAdamantidis oh uau, eu perdi completamente isso! Sim, a versão original não funcionaria desde que eu citei 'securityuser*'. O curinga deve ser expandido pelo shell, não por find, portanto deveria ter sido securityuser*(sem aspas). Veja a resposta atualizada. Obrigado por apontar, Stelio, não acredito que ninguém tenha notado antes! Ti vlakas!
terdon
4

conforme meu conhecimento:

findcomando try assim:

find ./dirc/* -mtime +6 -type f -delete

./dirc/* : is your directory (Path)
-mtime +6 : modified more than 6 days ago (therefore, at least 7 days ago)
-type f : only files
-delete : no surprise. Remove it to test before like rm
Maulik Patel
fonte
Obrigado pela sua resposta. ./Dirc/* significa: ./home/securityfolder1/* ou isso está errado?
Jacco van de Wijgaart 21/06
Eu apenas tentei na minha caixa virtual como find /home/jacco/ -mtime +1 -type f -deletee parece funcionar. Como posso automatizar isso?
Jacco van de Wijgaart
crie um arquivo de script e dispare esse comando usando script, se funcionar, além de executar seu arquivo de script no processo de inicialização.
Maulik Patel
Eu sou como o supernoob aqui porque a parte de fazer o script, isso significa um arquivo com #!/bin/bashe o código sob isso? ou eu sou realmente estúpido aqui?
Jacco van de Wijgaart
2
@ Melebius não, o caminho não deve ser citado, especialmente quando contém caracteres glob. Você quer que ele seja expandido pelo shell e as aspas bloqueariam isso. Tente, por exemplo: find '/u*' -name local. São diretivas como -name "foo*"essa que devem ser citadas ao conter caracteres glob.
terdon