Veuillez noter que je ne peux pas utiliser "Rechercher" dans l'environnement cible strong> J'ai besoin de supprimer tous les fichiers de plus de 7 jours dans un script de shell Linux. Quelque chose comme: p> puis-je utiliser "stat" pour faire cela? J'essayais d'utiliser p> mais j'ai découvert que je ne peux pas utiliser Rechercher sur le système cible (il n'y a aucune autorisation pour l'utilisateur cron et cela ne peut pas être modifié). Le système cible est RedHat Enterprise. P> Les noms de fichiers sont formatés comme celui-ci: p> gzip> / mnt / cible03 / reste de chemin de chemin / web / sauvegarde / backups / database__ code> date "+% Y-% m-% d" code> .gz p> p>
4 Réponses :
Ceci devrait fonctionner: un peu d'explication: stat
$ (date +% s) code> donne l'horodatage unique UNIX. Ensuite, il y a simplement un simple vérification de déterminer si l'horodatage du fichier, plus de sept jours de quelques secondes, est supérieur à l'horodatage actuel. P> P>
Merci - je reçois des erreurs sur un ")". Devrait-il aussi être aussi entre des citations? Je pose $ (RM "$ dossier") où est votre commentaire.
Vous devez seulement avoir besoin de mettre rm "$ fichier" code>
@PLL Merci pour ce script génial, mais cela n'a pas fonctionné sur BupérayBox, il fallait être massé un peu alors ici est la façon dont il a fonctionné me former: #! / pull / shir = / Vos / Fichiers "maintenant = $ (date +% s) jours = 30 pour fichier dans" $ dir / "* DO si [$ ((((( code> STAT $ Fichier -c"% y '
) + (86400 * $ jours))) -Lt $ maintenant] alors # processus / rm / quel que soit le fichier ... fi fait code>
Si vous préférez compter à la date dans les noms de fichiers, vous pouvez utiliser cette routine, qui vérifie si une date est plus ancienne qu'un autre: et vous pouvez ensuite faire boucle des noms de fichiers, Passage '-7 jours' comme deuxième date: P> in is_older code> routine,
date -d "-7 jours" +% +% Y% M% d code> retournera la date de 7 jours avant, au format numérique prêt à la comparaison. P> p>
Depuis que vous avez le temps dans le nom de fichier, utilisez-le pour le moment où la suppression de la suppression du code que cela fait:
Ce script obtient l'heure actuelle en quelques secondes depuis EPOCH, puis calcule l'horodatage il y a 7 jours. Ensuite, pour chaque fichier analyse du nom de fichier et convertit la date incorporée dans chaque nom de fichier à un horodatage compare, puis compare les horodatages pour déterminer quels fichiers à supprimer. Utiliser des horodatampes se débarrasse de tous les tracas avec le travail avec des dates directement (année bissextile, des jours différents en mois, etc.) p>
Le rejet réel est commenté afin que vous puissiez tester le code. P>
#funciton to get timestamp X days prior to input timestamp # arg1 = number of days past input timestamp # arg2 = timestamp ( e.g. 1324505111 ) seconds past epoch getTimestampDaysInPast () { daysinpast=$1 seconds=$2 while [ $daysinpast -gt 0 ] ; do daysinpast=`expr $daysinpast - 1` seconds=`expr $seconds - 86400` done # make midnight mod=`expr $seconds % 86400` seconds=`expr $seconds - $mod` echo $seconds } # get current time in seconds since epoch getCurrentTime() { echo `date +"%s"` } # parse format and convert time to timestamp # e.g. 2011-12-23 -> 1324505111 # arg1 = filename with date string in format %Y-%m-%d getFileTimestamp () { filename=$1 date=`echo $filename | sed "s/[^0-9\-]*\([0-9\-]*\).*/\1/g"` ts=`date -d $date | date +"%s"` echo $ts } ########################### MAIN ############################ # Expect directory where files are to be deleted to be first # arg on commandline. If not provided then use current working # directory FILEDIR=`pwd` if [ $# -gt 0 ] ; then FILEDIR=$1 fi cd $FILEDIR now=`getCurrentTime` mustBeBefore=`getTimestampDaysInPast 7 $now` SAVEIFS=$IFS # need this to loop around spaces with filenames IFS=$(echo -en "\n\b") # for safety change this glob to something more restrictive for f in * ; do filetime=`getFileTimestamp $f` echo "$filetime lt $mustBeBefore" if [ $filetime -lt $mustBeBefore ] ; then # uncomment this when you have tested this on your system echo "rm -f $f" fi done # only need this if you are going to be doing something else IFS=$SAVEIFS
Je l'ai essayé d'utiliser ce code mais juste obtenir cette sortie: 1325559634 lt 1324944000 1325559634 lt 1324944000 1325559635 lt 1324944000 1325559635 lt 1324944000 1325559635 lt 1324944000 1325559635 lt 1324944000 1325559635 lt 1324944000 1325559635 lt 1324944000 1325559635 lt 1324944000 1325559635 lt 1324944000 1325559635 lt 1324944000 1325559635 lt 1324944000 1325559635 lt 1324944000 1325559635 LT 1324944000
L'echo "RM -F $ F" ne semble jamais courir. Les fichiers sont nommés comme ceci - EESWAP_2011-12-20.GZ. La regex attrapera-t-elle ce nom de fichier correctement?
S'avère que TS = date -d date $ DATE | Date + "% s" code> devrait être TS =
date -d "date $ DATE" + "% s" code> Le script puis fonctionne
DIR='' now=$(date +%s) for file in "$DIR/"* do echo $(($(stat "$file" -c '%Z') + $((86400 * 7)))) echo "----------" echo $now done