Strona 1 z 1

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

: 25 października 2013, 10:14
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 

: 25 października 2013, 16:54
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.

: 25 października 2013, 23:37
autor: mtp
Nie lepiej zamiast tej pętli wykonać:

Kod: Zaznacz cały

 find "$dir"/* -mtime +60 -print0 |xargs -0 -r rm
?

: 28 października 2013, 13:21
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ę.