[+] Skrypt bash, kasowanie starych plików na serwerze

Potrzebujesz pomocy z C, C++, perl, python, itp.
gaijin
Posty: 42
Rejestracja: 06 czerwca 2012, 08:47

[+] Skrypt bash, kasowanie starych plików na serwerze

Post autor: gaijin »

Cześć
Mam taki oto skrypt który ma kasować kopie zapasowe, które są starsze niż 60dni ale zostawiać chociaż jedną jeżeli warunek nie jest spełniony.

Skrypt działa dobrze ale w przypadku nazwy kopii ze spacjami nie kasuje ich, rozpatruje każdy człon z osobna czyli:

plik: ala ma kota
ala: Nie ma takiego pliku ani katalogu
ls: nie ma dostępu do ma: Nie ma takiego pliku ani katalogu
ls: nie ma dostępu do kota.odt: Nie ma takiego pliku ani katalogu

Jak to naprawić?

Kod: Zaznacz cały

#!/bin/bash

data=`date +%Y-%m-%d_%H:%M`
raport="ścieżka/skrypt/${data}.raport.log"

for dir in 'ścieżka/folder/1/' 'ścieżka/folder/2/'
do
        ls -1Atr $(find "$dir"/* -mtime +60) | while read -r line
        do
                # tu robisz co chcesz z parametrem "$line"

        count=$(ls -1At "${line%/*}" | wc -l)

                if [ $count -gt 1 ] ; then
                        echo $line >> "$raport"
#                       echo tu jest wiecej niż jeden plik, wiec usuwam
        rm -f "$line"
                else
        echo tu jest 1 lub 0 plików
                fi
        done
done 
tom.k
Posty: 16
Rejestracja: 11 marca 2013, 11:21

Post autor: tom.k »

Cześć.
W
przypadku operacji na plikach ze spacjami musisz zmienić sobie IFS, czyli przed petlą "for" ustawiasz:

Kod: Zaznacz cały

IFS=$(echo -en "\n\b")
czyli w skrocie, sama petelka do kasowania wygladalaby mniej wiecej tak:

Kod: Zaznacz cały

#!/bin/bash

ORI_IFS=$IFS
IFS=$(echo -en "\n\b")

for a in $(find "$dir"/* -mtime +60); do
   rm "$a"
done

IFS=$ORI_IFS
Resztę uzupełnij według własnych potrzeb.

Pozdrawiam.
mtp
Posty: 10
Rejestracja: 16 października 2013, 13:58

Post autor: mtp »

Nie lepiej zamiast tej pętli wykonać:

Kod: Zaznacz cały

 find "$dir"/* -mtime +60 -print0 |xargs -0 -r rm
?
gaijin
Posty: 42
Rejestracja: 06 czerwca 2012, 08:47

Post autor: gaijin »

Kod: Zaznacz cały

#!/bin/bash

data=`date +%Y-%m-%d_%H:%M`
raport="/home/grzes/Desktop/QNAP/skrypt/${data}.raport.log"

  ORI_IFS=$IFS
  IFS=$(echo -en "\n\b")

for dir in '/home/grzes/Desktop/QNAP/skrypt/folder/1/' '/home/grzes/Desktop/QNAP/skrypt/folder/2/'
do

        ls -1Atr $(find "$dir"/*.* -mtime +60) | while read -r line
        do
                # tu robisz co chcesz z parametrem "$line"

        count=$(ls -1At "${line%/*.*}" | wc -l)

                if [ $count -gt 2 ] ; then
                        echo $line >> "$raport"
#                       echo tu jest wiecej niż jeden plik, wiec usuwam
        rm -f "$line"
                else
        echo tu jest 1 plik stary
                fi
        done
done 

  IFS=$ORI_IFS


Działa - dziękuję.
ODPOWIEDZ