web-dev-qa-db-fra.com

Nettoyer les fichiers d'hier via un script

Je voudrais exécuter une tâche cron qui a été exécutée tous les matins pour déplacer les fichiers créés la veille dans un répertoire spécifique pour les transférer dans un dossier créé avec le titre de dates précédentes.

Par exemple, Motion crée une série de fichiers jpg dans un répertoire appelé snapshots. J'aimerais que le script soit exécuté et trouve tous les fichiers créés hier dans le répertoire snapshots (y compris les fichiers avi créés par celui-ci), et les déplace dans un dossier avec la date d'hier comme titre.

Est-ce que quelqu'un a déjà essayé ça? Motion a-t-il déjà cette fonctionnalité intégrée et je ne la vois tout simplement pas?

La prochaine étape sera de l’auto-purger après 7 à 14 jours, mais c’est un tout autre article.

3
Nosaj Karotep

Ceci est très simplement fait par find. Les options pertinentes sont:

   -mtime n
          File's data was last modified n*24 hours ago.  See the  comments
          for -atime to understand how rounding affects the interpretation
          of file modification times.
   -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.
   -exec command ;
          Execute  command;  true  if 0 status is returned.  All following
          arguments to find are taken to be arguments to the command until
          an  argument  consisting of `;' is encountered.  The string `{}'
          is replaced by the current file name being processed  everywhere
          it occurs in the arguments to the command, not just in arguments
          where it is alone, as in some versions of find.  Both  of  these
          constructions might need to be escaped (with a `\') or quoted to
          protect them from expansion by the Shell.  

Ainsi, pour déplacer tous les fichiers jpg créés dans le répertoire snapshots au cours des dernières 24 heures, vous devez exécuter:

find /home/yourusername/snapshots/ -name '*jpg' -mtime +0 -exec mv {} /path/to/dest

Le {} est remplacé par chaque nom de fichier trouvé. Les guillemets ne sont pas nécessaires car find traite avec élégance les noms de fichiers étranges avant d'exécuter la commande. Le +0 signifie "le fichier a été modifié pour la dernière fois au moins 1 * 24h auparavant, comme expliqué dans la section atime citée ci-dessus.

Si vous souhaitez les déplacer vers un répertoire dont le nom correspond à la date d'hier, vous devez le créer (à l'aide de l'option -p afin que mkdir ne se plaint pas si le répertoire existe):

mkdir -p $(date -d yesterday +%F)

La commande date imprimera la date d'hier au format YYYY-MM-DD. Par exemple, 2014-06-18. Vous pouvez combiner les deux commandes dans le même appel find -exec (le \ après -mtime n’est là que pour la lisibilité, il vous permet de diviser une commande en plusieurs lignes):

find /home/yourusername/snapshots/ -name '*jpg' -mtime +0 \
 -exec bash -c "mkdir -p $(date -d yesterday +%F) && mv {} $(date -d yesterday +%F)" \;

Donc, pour exécuter ceci avec cron, vous pouvez ajouter une ligne comme celle-ci à votre crontab (exécuter crontab -e):

0 9 * * * find /home/yourusername/snapshots/ -name '*jpg' -mtime +0 -exec bash -c "mkdir -p $(date -d yesterday +%F) && mv {} $(date -d yesterday +%F)" \;

Ce qui précède exécute la commande find tous les jours à 9 heures.

5
terdon
find /path/to/my/folder/ -type f -mtime -1 -exec ls -l "{}" \;

Si vous voulez les déplacer, vous pouvez changer la commande exec:

find /path/to/my/folder/ -type f -mtime -1 -exec mv "{}" /path/to/my/newfolder/ \;

"{}" est le chemin complet de chaque nom de fichier correspondant à la recherche.

Le \; est requis à la fin de la ligne de commande.

Vous pouvez les supprimer en utilisant -delete:

find /path/to/my/folder/ -type f -mtime -1 -delete
3
Savvas Radevic