[solved] Bash – jak dodać kolejny numer do nowo tworzonego pliku?

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Mały 1
Zakręcona Traszka
Zakręcona Traszka
Posty: 548
Rejestracja: 24 sty 2008, 15:55
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: LXDE
Architektura: x86_64

Re: Bash – jak dodać kolejny numer do nowo tworzonego pliku?

Post autor: Mały 1 »

Dziękuje za napisanie skryptu, którego działanie sprawdziłem w praktyce.

Skrypt działa poprawnie, ale pozostał jeszcze jeden problem do rozwiązania. Problem polega na tym, że skrypt nie zawsze przerywa swoje działanie po podzieleniu całego filmu.

Oto przykład, gdzie skrypt poprawnie zakończył działanie (film dzielony na części po 100 MB):

Kod: Zaznacz cały

pic@nk:~/Pulpit/teścik$ bash zforum 
Czas trwania: 6180
Czas trwania fragmentu: 942
Czas całkowity: 942

Skipping frame!
Czas trwania fragmentu: 1008
Czas całkowity: 1950

Skipping frame!
Czas trwania fragmentu: 956
Czas całkowity: 2906

Skipping frame!
Czas trwania fragmentu: 633
Czas całkowity: 3539

Skipping frame!
Czas trwania fragmentu: 951
Czas całkowity: 4490

Skipping frame!
Czas trwania fragmentu: 760
Czas całkowity: 5250

Skipping frame!
Czas trwania fragmentu: 928
Czas całkowity: 6178
pic@nk:~/Pulpit/teścik$ 
Teraz przykłady gdzie skrypt nie przerywa działania po podzieleniu ostatniej części.

Ten sam film, ale dzielony na części po 300 MB:

Kod: Zaznacz cały

pic@nk:~/Pulpit/teścik$ bash zforum 
Czas trwania: 6180
Czas trwania fragmentu: 2904
Czas całkowity: 2904

Skipping frame!
Czas trwania fragmentu: 2345
Czas całkowity: 5249

Skipping frame!
Czas trwania fragmentu: 928
Czas całkowity: 6177
Czas trwania fragmentu: 0
Czas całkowity: 6177
Czas trwania fragmentu: 0
Czas całkowity: 6177
Czas trwania fragmentu: 0
Czas całkowity: 6177
Czas trwania fragmentu: 0
Czas całkowity: 6177
Czas trwania fragmentu: 0
Czas całkowity: 6177
Czas trwania fragmentu: 0
Czas całkowity: 6177
Czas trwania fragmentu: 0
Czas całkowity: 6177
Czas trwania fragmentu: 0
Czas całkowity: 6177
^C
pic@nk:~/Pulpit/teścik$ 
Tym razem tan sam film dzielony na części po 400 MB:

Kod: Zaznacz cały

pic@nk:~/Pulpit/teścik$ bash zforum 
Czas trwania: 6180
Czas trwania fragmentu: 3535
Czas całkowity: 3535

Skipping frame!
Czas trwania fragmentu: 2640
Czas całkowity: 6175
Czas trwania fragmentu: 0
Czas całkowity: 6175
Czas trwania fragmentu: 0
Czas całkowity: 6175
Czas trwania fragmentu: 0
Czas całkowity: 6175
Czas trwania fragmentu: 0
Czas całkowity: 6175
Czas trwania fragmentu: 0
pic@nk:~/Pulpit/teścik$ 
Teraz już ostatnia próba i dzielimy go na części po 50 MB:

Kod: Zaznacz cały

pic@nk:~/Pulpit/teścik$ bash zforum 
Czas trwania: 6180
Czas trwania fragmentu: 436
Czas całkowity: 436

Skipping frame!
Czas trwania fragmentu: 506
Czas całkowity: 942

Skipping frame!
Czas trwania fragmentu: 570
Czas całkowity: 1512

Skipping frame!
Czas trwania fragmentu: 434
Czas całkowity: 1946

Skipping frame!
Czas trwania fragmentu: 473
Czas całkowity: 2419

Skipping frame!
Czas trwania fragmentu: 484
Czas całkowity: 2903

Skipping frame!
Czas trwania fragmentu: 358
Czas całkowity: 3261

Skipping frame!
Czas trwania fragmentu: 283
Czas całkowity: 3544

Skipping frame!
Czas trwania fragmentu: 469
Czas całkowity: 4013

Skipping frame!
Czas trwania fragmentu: 478
Czas całkowity: 4491

Skipping frame!
Czas trwania fragmentu: 403
Czas całkowity: 4894

Skipping frame!
Czas trwania fragmentu: 354
Czas całkowity: 5248

Skipping frame!
Czas trwania fragmentu: 472
Czas całkowity: 5720

Skipping frame!
Czas trwania fragmentu: 457
Czas całkowity: 6177
Czas trwania fragmentu: 0
Czas całkowity: 6177
Czas trwania fragmentu: 0
Czas całkowity: 6177
Czas trwania fragmentu: 0
Czas całkowity: 6177
pic@nk:~/Pulpit/teścik$ 
Podsumowanie powyższych wyników:

Czas trwania: 6180

100 MB Czas całkowity: 6178 (skrypt zakończył działanie)
300 MB Czas całkowity: 6177 (skrypt nie zakończył działania)
400 MB Czas całkowity: 6175 (skrypt nie zakończył działania)
50 MB Czas całkowity: 6177 (skrypt nie zakończył działania)

Wniosek jest taki, że jeżeli różnica między czasem trwania (całego filmu), a czasem całkowitym (podzielonych części) wyniesie więcej niż 2 sekundy to skrypt nie kończy dzielenia.
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: Bash – jak dodać kolejny numer do nowo tworzonego pliku?

Post autor: ethanak »

No niestety - wada tego skryptu (jak widziałeś odejmuję 2 sekundy, ale zdaje się że dokładność jest nieco problematyczna). Operowanie z jednej strony czasem (bo nie da się rozpocząć od "megabajta") a z drugiej wielkością może wnosić błędy. Fakt - sprawdzałem to na kilku tylko filmach i w moim przypadku błąd nie przekroczył dwóch sekund, stąd moje radosne założenie.
Można spróbować to naprawić: jeśli pozostała ilość czasu jest na poziomie przeciętnego czasu partii (tzn. niewiele większa) lub mniejsza, nie podajesz parametru "endpos". Jeśli powstała część mieści się w założonej wielkości - kończysz pracę. W przeciwnym przypadku usuwasz powstały plik i przeprowadzasz normalny podział.
Spróbujesz się z czymś takim?
Bo w najprostszym przypadku wystarczy pewnie zmienić stałą "2" na powiedzmy "10" i mieć nadzieję że nie utnie nam ostatnich 10 sekund...
Mały 1
Zakręcona Traszka
Zakręcona Traszka
Posty: 548
Rejestracja: 24 sty 2008, 15:55
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: LXDE
Architektura: x86_64

Re: Bash – jak dodać kolejny numer do nowo tworzonego pliku?

Post autor: Mały 1 »

Z programowaniem nigdy nie miałem do czynienia. Pierwszy raz o programowaniu w powłoce Bash poczytałem kilka dni temu, ale to jest zdecydowanie za mało. Dlatego w tej chwili sam nie będę kaleczył Twojego skryptu. Jeżeli zaś będzie możliwość przetestowania skryptu z nową funkcją o której wspomniałeś wyżej to podzielę się swoją opinią na forum odnośnie jego działania.

Zastanawiałem się też nad tym, jak najprościej zdefiniować, aby skrypt samodzielnie kończył pracę.
Gdyby do skryptu dodać wpis, aby przed utworzeniem kolejnej części CD-*.avi wykonywać polecenie:

Kod: Zaznacz cały

pic@nk:~/Pulpit/test $ mplayer -identify -nosound -vo null -frames 0 CD-1.avi 2>/dev/null | awk -F= '/ID_LEN/ {print int($2)}'
5249
pic@nk:~/Pulpit/test $ 
Jeżeli wynik powyższego polecania będzie różny od zera to skrypt nie powinien kończyć swojej pracy, aż do momentu kiedy wynikiem będzie zero.

Kod: Zaznacz cały

pic@nk:~/Pulpit/test $ mplayer -identify -nosound -vo null -frames 0 CD-4.avi 2>/dev/null | awk -F= '/ID_LEN/ {print int($2)}'
0
pic@nk:~/Pulpit/test $ echo "Czas trwania: $orglen"

Zarówno gotowe rozwiązania, jak i uwagi mile widziane.


EDIT:

Zmodyfikowany, ale działający skrypt, który po podzieleniu filmu na części samodzielnie kończy pracę.

Kod: Zaznacz cały

#!/bin/bash
nazwa=nazwa_dzielonego_filmu
mb="100mb"
n=0

mencoder -ovc copy -oac copy -endpos "$mb" -o CD-$((n + 1)).avi "$nazwa" 

for a in "$nazwa"; do mv $a `basename $a .avi`.wmv; done

while [ 1 ]; do

find -type f -name "CD-*.avi" -print0 | xargs -0 mplayer -vo dummy -ao dummy -identify 2>/dev/null | perl -nle '/ID_LENGTH=([0-9\.]+)/ && ($t +=$1) && printf "%02d:%02d:%02d\n",$t/3600,$t/60%60,$t%60' | tail -n 1 > dane.txt; sleep 3

for a in *.wmv; do mv $a `basename $a .wmv`.avi; done

mencoder -ovc copy -oac copy -ss $(date -d @$(($(date -d $(sed -n '1p' dane.txt) +%s) - 20)) +%H:%M:%S) -endpos "$mb" -o CD-$(echo "numer=`ls CD-* | awk -F. 'BEGIN {m=0}; /-[0-9]/ {n=int(substr($1,4));if (n>m) m=n} END {print m+1}'`" > tmp.txt; awk 'BEGIN { FS = "=" } ; { print $2 }' tmp.txt; rm -f tmp.txt).avi "$nazwa"; sleep 3 

zmienna1="$($echo find -type f -name CD-$(echo "numer=`ls CD-* | awk -F. 'BEGIN {m=0}; /-[0-9]/ {n=int(substr($1,4));if (n>m) m=n} END {print m}'`" > tmp.txt; awk 'BEGIN { FS = "=" } ; { print $2 }' tmp.txt).avi -print0 | xargs -0 mplayer -vo dummy -ao dummy -identify 2>/dev/null | perl -nle '/ID_LENGTH=([0-9\.]+)/ && ($t +=$1) && printf "%02d:%02d:%02d\n",$t/3600,$t/60%60,$t%60' | tail -n 1)"

zmienna2="00:00:00"

if [ "$zmienna1" = "$zmienna2" ] ; then break; fi

done
Dziękuje wszystkim za pomoc.
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 5 gości