Nowe posty

Autor Wątek: Wyłuskanie roku i miesiącą z nazwy pliku w skrypcie "shell"  (Przeczytany 3165 razy)

asalamon

  • Gość
Od razu zaznaczam że szukałem w sieci i próbowałem sam to zrobić ale niestety jestem głównie sieciowcem i po 2 dniach sie poddałem.
Komuś to zajmie pewnie 5 minut odpowiedzieć więc PROSZE o pomoc.

Mam skrypt shell, który konwertuję stare nagrania .wav w Asterisk do mp3 i wrzuca na przenośny dysku USB do odpowiedniej struktury katalogów wg daty nagrania, zaszytej w nazwie pliku.

Przykładowy plik to:
113-98601280181-20110722-101511-1311322511.6422.wav.
I chcę wyłuskać z niego 2011 i 07 (trzecia liczba) jako dwie zmienne $...

Poniżej skrypt gdzie próbowałem na dwa sposoby (regexp i cut -d)
ale cos mi to nie działa - regexp wywala błąd składni a $data jest pusty.

Teraz ten skrypt po prostu bierze aktualną datę pliku z momentu wykonywania się w cronie i to jest źle.

Wspomniany Asterisk to dokładnie Trixbox bazujący na CentOS:
[trixboasterisk bin]# uname -a
Linux trixboasterisk 2.6.18-128.1.10.el5 #1 SMP Thu May 7 10:39:21 EDT 2009 i686 i686 i386 GNU/Linux

Interesuje nas to co zachaszowane !

 
#!/bin/sh
# Converts call records older then 30 days to mp3 and archives them into special directory structure

for i in `find /var/spool/asterisk/monitor/* -mtime +30`; do
   file=`basename "$i" .wav`
   #file =~ m/^.*-.*-([0-9]{4})([0-9]{2})([0-9]{2})-.*/
   #rok=$1
   #miesiac=$2
   #echo $file | cut -d'-' -f3 | read data
 
   rok=$(date +"%Y")
   miesiac=$(date +"%B")
   path="/var/spool/asterisk/monitor/archiwum/$rok/$miesiac"
   echo "###### Konweruje plik: $file.wav ######"
   mkdir -p $path
   lame -b 32 "$i" "$path/$file.mp3"
   rm -f "$i"
   echo "###### Zrobione ######"
done

  • Gość
Wyłuskanie roku i miesiącą z nazwy pliku w skrypcie "shell"
« Odpowiedź #1 dnia: 2011-10-15, 13:27:39 »
Podstawowe pytanie brzmi:
czy pierwsze dwie liczby mają różną liczbę znaków, czy zawsze taką samą?

Jeżeli mają stałą, to możesz to zrobić tak:
YEAR=$(echo "$file" |cut -b 17-20)
lub nawet tak (bashyzm!):
YEAR=${VAR:16:4}
Jeżeli pierwsze dwie liczby mogą składać się z różnej liczby cyfr, to możesz np. tak:
echo "$VAR" |awk -F \\- '{print substr($3, 0, 4)}'
echo "$VAR" |sed -e 's:[0-9]*-[0-9]*-\\([0-9]\\{4\\}\\).*:\\1:'
Jest jeszcze wersja wykorzystująca dwa cuty, ale ona nie jest koszerna, więc nie podaję.

Dla miesiąca będzie analogicznie w obu przypadkach, powinieneś już sobie poradzić.

Jeżeli pierwsze dwie liczby są w ogóle opcjonalne (mogą nie występować), to też się da, chociaż będzie to trudniejsze do zrobienia.

Zapis file =~ m/... nie działa, gdyż to zapis z perla. Powłoka zgodna z sh Bourne'a nie ma prawa go rozumieć.

asalamon

  • Gość
Wyłuskanie roku i miesiącą z nazwy pliku w skrypcie "shell"
« Odpowiedź #2 dnia: 2011-10-15, 13:52:23 »
Dzięki za zainteresowanie i pomoc - sprawdze podpowiedź !

Pierwsza liczba to numer wewnętrzny i albo zawsze bedą tam 3 cyfry albo nic (jest to mało
prawdopodobne ale może sie zdarzyć że Asterisk nie będzie w stanie określić numeru wew.)

Druga liczba to prefiks + numer pod jaki ktoś zadzwonił i tutaj może być różna liczba cyfr...

  • Gość
Wyłuskanie roku i miesiącą z nazwy pliku w skrypcie "shell"
« Odpowiedź #3 dnia: 2011-10-15, 14:13:47 »
Jeżeli Asteriks nie będzie potrafił określić numeru wewnętrznego, to plik będzie miał postać:
-98601280181-20110722-101511-1311322511.6422.wav
czy
98601280181-20110722-101511-1311322511.6422.wav
?

Jeżeli ta pierwsza, to awk z mojego poprzedniego postu się nada. Jest to chyba również najbardziej czytelna wersja rozwiązania problemu.

Jeżeli ta druga, to w awk można tak:
echo "$VAR" |awk -F \\- '{print substr($(NF-2), 0, 4)}'
No chyba że liczba pól po trzecim polu (tym z datą) również jest zmienna. Wtedy pewnie najlepiej by było przepisać to na perla, gdyż jego silnik wyrażeń regularnych jest bardziej elastyczny niż ten oferowany przez seda (co nie znaczy że sedem się nie da).

Aha -- teraz widzę, że w moich przykładach zamiast $file jest $VAR. Po prostu ja u siebie sprawdzałem to na zmiennej VAR i przekopiowałem działające przykłady na forum, zapominając żeby zmienić nazwę zmiennej. Ale z tym już sobie poradzisz.

asalamon

  • Gość
Wyłuskanie roku i miesiącą z nazwy pliku w skrypcie "shell"
« Odpowiedź #4 dnia: 2011-10-15, 14:23:11 »
Zrobiłem z tym awk i działa poprawnie :)

Bez pierwszej liczby będzie z '-" na początku wiec wszystko będzie dobrze.

DZIEKUJE BARDZO ZA POMOC.