Je stocke des données dans des fichiers qui suivent cette convention de nommage:
/interesting/data/filename-YYYY-MM-DD-HH-MM
Comment chercher ceux avec date in file name < now - 1 month
et les supprimer?
Les fichiers peuvent avoir changé depuis leur création. Vous devez donc effectuer une recherche en fonction de last modification date
n'est pas bon.
Ce que je fais maintenant, c'est filtre en les python:
prefix = '/interesting/data/filename-'
import commands
names = commands.getoutput('ls {0}*'.format(prefix)).splitlines()
from datetime import datetime, timedelta
all_files = map(lambda name: {
'name': name,
'date': datetime.strptime(name, '{0}%Y-%m-%d-%H-%M'.format(prefix))
}, names)
month = datetime.now() - timedelta(days = 30)
to_delete = filter(lambda item: item['date'] < month, all_files)
import os
from operator import itemgetter
map(os.remove, map(itemgetter('name'), to_delete))
Y a-t-il un (une doublure) bash
solution pour cela?
man find
:-ctime n
Le statut du fichier a été modifié pour la dernière fois il y a n * 24 heures. Cela ne renvoie que les noms de fichiers de cette date exacte, mais dans mon cas, il peut y avoir des fichiers plus anciens que, et je ne peux pas dire quel âge ils ont, alors j'ai vraiment besoin d'un `& lt; `ou` & lt; = `comparaison.man find
dit: Les arguments numériques peuvent être spécifiés comme suit:+n
(pour plus que n),-n
(pour moins que n),n
(pour exactement n). Et cela fonctionne comme souhaité. Merci!En présumant que la date GNU et GNU trouveront, vous pouvez le faire de cette façon
Mais ce n'est pas exactement un oneliner.
Comme cela est sous test et quelque peu dangereux, j’ai inclus un
echo
préfixe aurm
commande, vous devrez donc la supprimer une fois que vous aurez vérifié que les résultats sont corrects.Une faiblesse ici réside dans la sélection initiale des fichiers.
-path "$prefix"'*'
suppose des chemins absolus et va casser autrement; une sélection plus intelligente est probablement meilleure, même s’il s’agit d’un simple shell glob (c'est-à-dire, remplacer la boucle while parfor file in "$prefix*" ; do ... done
. Je ne l'ai pas fait parce que je ne sais pas si une telle expansion globale déborderait la longueur de commande maximale.la source
touch
des dossiers. lefind . ! -newer' can much more simply be replaced by the
[$ FILE1 -ot $ FILE2] `, au moins en bash.-ot
. J'aurais utilisé cette comparaison si j'y avais pensé, mais au lieu de cela, j'ai recyclé une solution que j'avais utilisée auparavant (lorsque j'avais GNU find sous Windows, mais aucun sh).-newerXY
oùY
estt
spécifier directement un horodatage (pour GNUfind
c'est GNUdate -d
format) pour éviter de créer un fichier intermédiaire. Ce sera un peu plus rapide, comme le mentionne Rich.