Skocz do zawartości

Kontrola Ilości Wolnego Miejsca


morg

Rekomendowane odpowiedzi

Cześć

 

Od jakiegoś czasu borykam się z problemem wolnego miejsca. Na serwerach czasami jest, czasami nie ma wiec korzystając z książki "Bash receptury" przepisałem na żywca kod odpowiedzialny za kontrolę wolnego miejsca podczas kopiowania plików do odtwarzacza mp3. Próbowałem go jakoś przerobić ale jedynie co to udało mi się pobrać do zmiennej ilość wolnego miejsca a i to nie wiem czy to w bajtach czy w blokach.

 

Problem mój to export bazy Oracle, rozpakowanie zipa, skopiowanie czegośtam gdzieśtam. Pomimo tego, że zasoby HDD w obecnych czasach są olbrzymie to czasem jednak brakuje miejsca. Takim magicznym rozmiarem rozpakowanego zipa jest okolo 700 mb które chciałbym odjąć od ilości wolnego miejsca znajdującego sie na wskazanym wolumenie. W zależności od tego czy jest odpowiednia ilość wolnego miejsca akcja się rozpocznie lub nie.

 

Żeby było ciekawiej mam kilka, kilkanaście katalogów do których wrzucane sa paczki z zipem (120 ~ 140 mb) a następnie rozpakowywane (całość (zip+zawartość) = 700 ~ 900 mb). Mój problem polega na tym, że dzieje się to w jednym czasie dla wszystkich katalogów. Eksperymentowanie z taką linią wymaga wsadzenia jej do crona z kilku sekundowym interwałem czasowymm odczytującym zasoby:

 

serwer=`uname -n `

if
[[ $serwer = "emi" ]]
then
FREE=$(df -k /dev/oradlv  | tail -1 | awk '{print $3}') && echo $FREE
fi

 

 

Ale to mogę pominąć. Bardziej interesuje mnie kontrola wolnego miejsca. A oto wspomniany przeze mnie kod:

 

 

#!/usr/bin/env bash

# Wyznaczanie rozmiaru pliku
#
function FILESIZE ()
{
FN=${1:-/dev/null}
if [[ -e $FN ]]
then
	# FZ=$(ls -s $FN | cut -d ' ' -f 1)
	set -- $(ls -s "$FN")
	FZ=$1
fi
}

# Obliczanie wolnego miejsca na dysku docelowym
#
function FREESPACE
{
	 FREE=$(df /media/mp3 | awk '/^\/dev/ {print $4}')
set -- $(df /media/Przenosny | grep '^/dev/')
FREE=$4
}

# Odjecie (przekazanego) rozmiaru pliku od (globalnej) wartosci wolnego miejsca

function REDUCE ()
(( FREE-=${1:-0}))

# glowna czesc skryptu

let SUM=0
let COUNT=0
export FZ
export FREE
FREESPACE
find . -name '*.mp3' -print | \
(while read PATHNM
do
FILESIZE "$PATHNM"
if ((FZ <= FREE))
then 
	echo zapisywanie $PATHNM
	cp "$PATHNM" /media/Przenosny
	if (( $? == 0 ))
	then
		let SUM+=FZ
		let COUNT++
		REDUCE $FZ
	else
		echo "blad kopiowania pliku $PATHNM do katalogu /media/Przenosny"
		rm -f /media/Przenosny/$(basename "$PATHNM")
		# ponowne obliczanie - nie wiadomo, jaka czesc zadania jest wykonana
		FREESPACE
	fi
	# czy mozna kontynuowac?
	if (( FREE <= 0 ))
	then
		break
	fi
else
	echo pominiecie $PATHNM
fi
done
printf "%d utworow (%d blokow)" $COUNT $SUM
printf " zostalo zapisanych w katalogu /media/Przenosny (%d blokow wolnych)\n" $FREE)
#koniec

 

 

 

Niestety, kod działa tylko do kopiowania.

 

Jak go przerobić do np unzipa lub innego programu który będzie zabierał wolne miejsce na dysku ?

 

 

M.

 

 

 

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...