morg Napisano Marzec 25, 2009 Zgłoszenie Share Napisano Marzec 25, 2009 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 More sharing options...
Rekomendowane odpowiedzi
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ę