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