web-dev-qa-db-fra.com

Supprimer tous les fichiers sauf le plus récent du format 08-20-2018_01: 24 h

J'utilise ceci pour qu'il soit plus facile de voir quand un script de sauvegarde a été exécuté.

touch /media/andy/MAXTOR_SDB1/Ubuntu_Mate_18.04/$( date '+%m-%d-%Y_%I:%M-%p' )

Je voudrais un script qui effacerait tous les fichiers sauf le plus récent UNIQUEMENT de ce type 08-20-2018_01: 24 h

2
fixit7

Premièrement, je suggérerais d'utiliser un format de date et d'heure qui sera analysé plus facilement. Par exemple:

$ date '+%Y-%m-%d_%H:%M'
2018-08-21_21:41

Ensuite, vous pouvez utiliser quelque chose comme suit, pour ne garder que le fichier le plus récent ( référence ):

#!/bin/bash
TARGET_DIR='./'
REGEX='[0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9]{2}:[0-9]{2}'   # regular expression that match to: date '+%Y-%m-%d_%H:%M'
LATEST_FILE="$(ls "$TARGET_DIR" | egrep "^${REGEX}$" | tail -1)"
find "$TARGET_DIR" ! -name "$LATEST_FILE" -type f -regextype egrep -regex ".*/${REGEX}$" -exec rm -f {} +

Si vous souhaitez supprimer un nombre de fichiers plus ancien qu'une période, vous pouvez utiliser quelque chose comme ceci ( source de l'idée ):

#!/bin/bash
TARGET_DIR='./'
MAX_AGE='3 days ago'
AGE="$(date '+%Y%m%d%H%M' --date="$MAX_AGE")"

for file in "$TARGET_DIR"/*
do
    CLR="$(echo $(basename "$file") | sed -e 's/-//g' -e 's/_//g' -e 's/://g')"

    if [[ -f $file ]] && [[ $AGE -ge $CLR ]] 2>/dev/null
    then
        rm -f "$file"
    fi 
done

Une autre option consiste à utiliser find et à supprimer les fichiers antérieurs à une période donnée, en fonction de leur date de création. Par exemple, la commande suivante supprimera tous les fichiers de plus de 2 jours:

find /path/ -mtime +2 -type f -delete

Des idées de scripts de sauvegarde complets sont disponibles à l’adresse suivante:

2
pa4080