Supprimer automatiquement les fichiers de plus de 7 jours

17

Je suis un noob complet chez linux mais je commence à comprendre. J'ai un serveur Ubuntu 16.04 exécutant un serveur FTP pour sauvegarder les fichiers vidéo de sécurité. Les fichiers seront stockés dans des dossiers tels que : /home/securityfolder1, /home/securityfolder2, /home/securityfolder3et ainsi de suite.

Notez que chacun securityfolderNest un utilisateur différent.

Parce que je ne veux pas que mes disques durs soient pleins tout le temps, je veux supprimer quotidiennement des fichiers de plus de 7 jours dans ces dossiers.

Jacco van de Wijgaart
la source
/homecontient généralement un sous-dossier pour chaque utilisateur. Si vous ne voulez pas stocker vos sauvegardes en tant qu'utilisateurs différents (ce n'est pas vraiment une bonne idée), vous devriez envisager un autre emplacement, par exemple /home/security/backup1, etc.
Melebius
@Melebius merci pour votre commentaire, chaque / securityfolder est un utilisateur différent, j'ai oublié de le mentionner.
Jacco van de Wijgaart

Réponses:

27

Tout d'abord, cette commande recherchera et supprimera tous les fichiers de plus de 7 jours dans n'importe quel sous-répertoire /homedont le nom commence par securityuser:

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

Vous en avez besoin -mtime +6et non +7parce que -mtimecompte des périodes de 24h. Comme expliqué dans la -atimesection man find( -mtimefonctionne de la même manière):

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

Donc, pour trouver un fichier qui a été modifié il y a 7 jours ou plus, vous devez donc rechercher les fichiers qui ont été modifiés il y a plus de 6 jours -mtime +6.

L'étape suivante consiste à exécuter cette commande une fois par jour. Étant donné que chacun securityuserNest un utilisateur différent (vous voudrez peut-être repenser cette configuration, cela rend tout plus compliqué), cela doit être exécuté en tant que root. Alors, éditez /etc/crontab:

sudo nano /etc/crontab

Et ajoutez cette ligne:

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

Cela exécutera la findcommande une fois par jour et supprimera les fichiers.

terdon
la source
+1 Conduire l'ongle un peu plus profondément et peut-être réitérer la suggestion de Melebius à OP, qui find '/home/securityuser/*' -mtime +6 -type f -delete(avec tous les changements pertinents et appropriés dans la création d'utilisateurs) pourrait généralement être une meilleure idée que find '/home/securityuser*' -mtime +6 -type f -delete(pas de barre oblique) ...?
Cbhihe
@Cbhihe non, les répertoires cibles sont appelés /home/securityuserN, donc sans barre oblique, ils ne seront pas trouvés.
terdon
yup, vu cela; ne pensait tout simplement pas que c'était une bonne pratique de la part d'OP (créer un utilisateur séparé pour chaque vidéo de sécurité, etc ...) dans la lignée du premier commentaire de Melebius, même si OP peut avoir ses raisons de le faire. Si quoi que ce soit, mon commentaire était boiteux, pas une critique de votre bonne et complète réponse.
Cbhihe
1
+1 De moi. Notez juste un détail pendant que j'exécutais cela sur RHEL: le caractère générique ne fonctionnait pas sur le chemin. Je devais le mettre sur -name:find /home/ -name 'securityuser*' -mtime +6 -type f -delete
Stelios Adamantidis
1
@SteliosAdamantidis oh wow, j'ai complètement raté ça! Oui, la version originale ne fonctionnerait pas puisque j'avais cité 'securityuser*'. Le caractère générique doit être développé par le shell, pas par find, donc il aurait dû l'être securityuser*(sans guillemets). Voir la réponse mise à jour. Merci de l'avoir signalé, Stelio, je ne peux pas croire que personne ne l'ait remarqué auparavant! Ti vlakas!
terdon
4

selon mes connaissances:

essayez la findcommande comme ceci:

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
la source
Merci pour votre réponse. Est-ce que ./dirc/* signifie: ./home/securityfolder1/* ou est-ce faux?
Jacco van de Wijgaart
Je viens de l'essayer dans ma virtualbox find /home/jacco/ -mtime +1 -type f -deleteet cela semble fonctionner. Comment puis-je automatiser cela?
Jacco van de Wijgaart
créez un fichier de script et lancez cette commande en utilisant un script si cela fonctionne que d'exécuter votre fichier de script au démarrage.
Maulik Patel
je suis comme le supernoob juste ici cuz la partie de faire le script, cela signifie-t-il un fichier avec #!/bin/bashet le code en dessous? ou suis-je vraiment stupide ici?
Jacco van de Wijgaart
2
@Melebius non, ce chemin ne doit pas être cité, surtout lorsqu'il contient des caractères globaux. Vous voulez qu'il soit développé par le shell et la citation bloquerait cela. Essayez, par exemple: find '/u*' -name local. Ce sont des directives de ce genre -name "foo*"qui doivent être citées lors de la création de caractères globaux.
terdon