GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Was ist falsch an meinem Bash-Skript, um die letzten x Dateien zu behalten und den Rest zu löschen?

Sie könnten dies versuchen:

ls -r1 $PT_MYSQLBACKUPPATH/ | tail -n +$(($PT_FILESTOKEEP+1)) | xargs rm

ls -r1 listet alle Dateien in umgekehrter Reihenfolge auf, eine Datei pro Zeile.

tail -n +$number filtert die ersten $number-1 Dateien der Liste heraus (bzw. zeigt alle Dateien ab $number bis zur letzten an).

xargs führt rm aus mit allen Dateinamen aus der Standardeingabe.


Stellen Sie zunächst sicher, dass Sie sich im richtigen Ordner befinden:

if [ -z $PT_MYSQLBACKUPPATH ]; then
 echo "No PT_MYSQLBACKUPPATH set. Exit"
 exit 1
fi
cd $PT_MYSQLBACKUPPATH
if [ $? != 0 ]; then
 echo "cd to PT_MYSQLBACKUPPATH failed. Exit"
 exit 1
fi

Sie können Dateien entfernen, die älter als n sind, in Ihrem Fall:

find -mtime +14 -delete

Löscht Dateien, die älter als 14 Tage sind.

Kompliziertere (aber definitiv nicht optimale) Lösung für Ihre Frage:

# Get list of newest files. If newest files are first, use head -n 14 instead of 
# head.
files=(`ls | sort | tail -n 14`)
# Loop over all files in this folder
for i in *; do 
 preserve=0; 
 #Check whether this file is in files array:
 for a in ${files[@]}; do 
  if [ $i == $a ]; then 
   preserve=1; 
  fi; 
 done; 
 # If it wasn't, delete it (or in this case, print filename)
 if [ $preserve == 0 ]; then 
  echo $i; # test first, then change this to "rm $i"
 fi;
done

Hier ist meine Verwendung der Inspiration aus diesem Beitrag:

#!/bin/bash
# Thu Jun 28 13:22:53 CEST 2012
# ${DESTDIR}/files2keep.sh
# Keep the 3 yungest files
# mra at miracleas.dk , deployed on RHEL 6.
InitValues(){
TODAY=`date +"%Y%m%d"`
NOW=`date +"%H%M"`
DESTDIR=/mnt/dbdmp
LOGFILE=?{0}-${TODAY}-${NOW}.log
}
BackupFileMaintenance(){
KEEPFILES=(`ls -lrt ${DESTDIR}/*mysqldump.sql.gz| tail -n 3| awk '{print $9}'`)
    for i in `ls -lrt ${DESTDIR}/*mysqldump.sql.gz | awk '{print $9}'`; do
    preserve=0 
    #Check whether this file is in files array:
        for a in ${KEEPFILES[@]}; do
                if [ $i == $a ]; then
                preserve=1 
                fi 
        done 
    if [ $preserve == 0 ]; then
    echo $i; # then change this to "rm -f $i" after test
    fi
    done
}
InitValues
BackupFileMaintenance
exit

Linux
  1. Navigieren in der Bash-Shell mit pushd und popd

  2. Bash .hushlogin, letzte Anmeldezeit und Host behalten?

  3. Wie fügt man Benutzerkonto UND Passwort automatisch mit einem Bash-Skript hinzu?

  4. Löschen Sie alle Dateien außer den neuesten 3 im Bash-Skript

  5. Was ist der Unterschied zwischen &> und >&in bash?

Finden Sie Dateien und Verzeichnisse unter Linux mit dem Befehl find

Importieren Sie Funktionen und Variablen mit dem Quellbefehl in Bash

Wie verschiebt man Dateien und zeigt den Fortschritt an (z. B. mit einem Fortschrittsbalken)?

Alle Dateien in einem Ordner außer den letzten (neuesten) 20 löschen?

Alte Protokolldateien außer der letzten löschen (alphanumerisch sortiert)?

So finden Sie Dateien mit Dutzenden von Kriterien mit dem Bash-Suchbefehl