GNU/Linux >> Znalost Linux >  >> Linux

Co je špatného na mém bash skriptu, který ponechává posledních x souborů a zbytek smaže?

Můžete zkusit toto:

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

ls -r1 zobrazí seznam všech souborů v opačném pořadí, jeden soubor na řádek.

tail -n +$number odfiltruje první soubory $number-1 ze seznamu (resp. zobrazí všechny soubory začínající od $number až po poslední).

xargs spustí rm se všemi názvy souborů ze standardního vstupu.


Nejprve se ujistěte, že jste ve správné složce:

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

Můžete odstranit soubory starší než n, ve vašem případě:

find -mtime +14 -delete

Smaže soubory starší než 14 dní.

Složitější (určitě ne optimální) řešení vaší otázky:

# 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

Zde je moje použití inspirace z tohoto příspěvku:

#!/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. Jak automaticky přidat uživatelský účet A heslo pomocí skriptu Bash?

  2. Bash skript pro odstranění všech souborů kromě N při abecedním řazení

  3. Jaké jsou rozdíly mezi lsof a netstat na linuxu?

  1. Jak přesunout soubory a zobrazit průběh (např. pomocí ukazatele průběhu)?

  2. Použití find a tar se soubory se speciálními znaky v názvu

  3. Jaký je rozdíl mezi prováděním skriptu Bash a jeho získáváním?

  1. Smazat všechny soubory ve složce kromě posledních (nejnovějších) 20?

  2. Jaký je účel souborů utmp, wtmp a btmp v Linuxu

  3. Co je špatného na linux/if.h a net/if.h?