7
votes

Comment trouver et supprimer des fichiers basés sur la date dans un script de shell Linux sans trouver?

Veuillez noter que je ne peux pas utiliser "Rechercher" dans l'environnement cible

J'ai besoin de supprimer tous les fichiers de plus de 7 jours dans un script de shell Linux. Quelque chose comme: xxx

puis-je utiliser "stat" pour faire cela? J'essayais d'utiliser xxx

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.

Les noms de fichiers sont formatés comme celui-ci:

gzip> / mnt / cible03 / reste de chemin de chemin / web / sauvegarde / backups / database__ code> date "+% ​​Y-% m-% d" .gz


0 commentaires

4 Réponses :


8
votes

Ceci devrait fonctionner: xxx

un peu d'explication: stat -c '% z' donne la durée de modification du fichier en secondes car L'époque UNIX pour un fichier, et $ (date +% s) 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.


3 commentaires

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"


@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 [$ ((((( STAT $ Fichier -c"% y ') + (86400 * $ jours))) -Lt $ maintenant] alors # processus / rm / quel que soit le fichier ... fi fait



2
votes

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: xxx

et vous pouvez ensuite faire boucle des noms de fichiers, Passage '-7 jours' comme deuxième date: xxx

in is_older routine, date -d "-7 jours" +% +% Y% M% d retournera la date de 7 jours avant, au format numérique prêt à la comparaison.


0 commentaires

3
votes

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


3 commentaires

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" devrait être TS = date -d "date $ DATE" + "% s" Le script puis fonctionne



0
votes
DIR=''

now=$(date +%s)

for file in "$DIR/"*
do
echo $(($(stat "$file" -c '%Z') + $((86400 * 7))))
echo "----------"
echo $now
done

0 commentaires