Eliminar automáticamente archivos de más de 7 días

17

Soy un novato completo en Linux, pero estoy empezando a entenderlo. Tengo un Ubuntu Server 16.04 que ejecuta un servidor FTP para respaldar archivos de video de seguridad. Los archivos se almacenan en carpetas como: /home/securityfolder1, /home/securityfolder2, /home/securityfolder3y así sucesivamente.

Tenga en cuenta que cada uno securityfolderNes un usuario diferente.

Porque yo no quiero que mis discos duros a estar lleno todo el tiempo, quiero borrar archivos mayores de 7 días en estas carpetas diarias.

Jacco van de Wijgaart
fuente
/homegeneralmente contiene una subcarpeta para cada usuario. Si no desea almacenar las copias de seguridad como los diferentes usuarios (no muy buena idea), se debe considerar otra ubicación, por ejemplo, /home/security/backup1y así sucesivamente.
Melebius
@Melebius gracias por su comentario, cada securityfolder / es un usuario diferente, se me olvidó mencionar que.
Jacco van de Wijgaart

Respuestas:

27

Primero, este comando buscará y eliminará todos los archivos anteriores a 7 días en cualquier subdirectorio /homecuyo nombre comience con securityuser:

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

Necesita -mtime +6y no +7porque -mtimecuenta períodos de 24h. Como se explica en la -atimesección de man find( -mtimefunciona de la misma manera):

   -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.

Por lo tanto, para encontrar un archivo que se modificó hace 7 o más días, debe buscar archivos que se modificaron hace más de 6 días, por lo tanto -mtime +6.

El siguiente paso es ejecutar este comando una vez al día. Dado que cada uno securityuserNes un usuario diferente (es posible que desee repensar esa configuración, hace que todo sea más complicado), esto debe ejecutarse como root. Entonces, edita /etc/crontab:

sudo nano /etc/crontab

Y agregue esta línea:

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

Eso ejecutará el findcomando una vez al día y eliminará los archivos.

terdon
fuente
+1 Profundizar un poco más y tal vez reiterar la sugerencia de Melebius a OP, que find '/home/securityuser/*' -mtime +6 -type f -delete(con todos los cambios pertinentes y apropiados en la creación de usuarios) en general podría ser una mejor idea que find '/home/securityuser*' -mtime +6 -type f -delete(sin barra en el camino) ...?
Cbhihe
@Cbhihe no, los directorios de destino se llaman /home/securityuserN, por lo que sin la barra, no se encontrarán.
terdon
sí, vi eso; simplemente no lo consideró una buena práctica por parte de OP (crear un usuario separado para cada video de seguridad, etc.) en la línea del primer comentario de Melebius, a pesar de que OP puede tener sus razones para hacerlo. En todo caso, mi comentario fue poco convincente, no una crítica de su buena y completa respuesta.
Cbhihe
1
+1 de mi parte. Solo tenga en cuenta un detalle mientras ejecutaba esto en RHEL: el comodín no funcionó en el camino. Tuve que ponerlo en el -name:find /home/ -name 'securityuser*' -mtime +6 -type f -delete
Stelios Adamantidis
1
@SteliosAdamantidis oh wow, estoy totalmente perdido eso! Sí, la versión original no funcionaría desde que lo cité 'securityuser*'. El comodín debe ser ampliado por el shell, y no por find, por lo que debería haber sido securityuser*(sin comillas). Ver respuesta actualizada. Gracias por señalarlo, Stelio, no puedo creer que nadie se dio cuenta antes! Ti vlakas!
terdon el
4

Según mi conocimiento:

prueba findcomando como este:

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
fuente
Gracias por su respuesta. ¿./Dirc/* significa: ./home/securityfolder1/* o está mal?
Jacco van de Wijgaart
Acabo de probarlo en mi virtualbox como find /home/jacco/ -mtime +1 -type f -deletey parece funcionar. ¿Cómo puedo automatizar esto?
Jacco van de Wijgaart
cree un archivo de secuencia de comandos y active este comando utilizando la secuencia de comandos si funciona que ejecutar su archivo de secuencia de comandos en el proceso de inicio.
Maulik Patel
Soy como el supernoob aquí mismo porque la parte de hacer el script, ¿esto significa un archivo con #!/bin/bashel código debajo? o soy realmente estúpido aquí?
Jacco van de Wijgaart
2
@Melebius no, esa ruta no debe ser citada, especialmente cuando contiene caracteres globales. Usted desea que se expanda por la concha y la cita que bloquearía. Pruebe, por ejemplo: find '/u*' -name local. Esas directivas como -name "foo*"esa deberían citarse cuando contienen caracteres globales.
terdon