Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
Witam!
Trza mi skryptu, który by wrzucał pliki w miejsce "<input>":
|ffmpeg -i <input> -f avi -vcodec libxvid -b <value> -ab <value> <output>
I potem w miejsce "<output>" wyrzucał dane pliki, ale z innym rozszerzeniem. Czyli coś na zasadzie pobrania nazwy plików z folderu, sprawdzania czy dany plik już jest itp. Moglibyście mi podpowiedzieć, jak to rozwiązać przy pomocy instrukcji "when... do... done"?
Offline
Nie wiem, czy o to ci chodzi więc się jeszcze dopytam.
1. Chcesz, aby z danego katalogu pobrana została nazwa pliku (z jakim rozszerzeniem?), a następnie rozszerzenie tego pliku zostało zmienione na inne (na jakie?) .
2. Plik, któremu zmieniłeś rozszerzenie ma pozostać w tym samym katalogu, czy powinien zostać przeniesiony do innego?
Offline
z grubsza coś takiego:
for FILE in *.avi; do NEWFILE="`basename "$FILE" .avi`.mpg" if [ ! -e "$NEWFILE" ]; then ffmpeg -i "$FILE" -f avi -vcodec libxvid -b <value> -ab <value> "$NEWFILE" fi done
Offline
find ~/muza -iname '*.mp3' |while read PLIK; do ffmpeg --cośtam --cośtam -i $PLIK ~/tutaj/to/trzeba/zrzucić/${PLIK%.*}.ogg ; done;
Przykład nie testowany, "na oko dziad w szpitalu umarł" ale mniej więcej tak to może wyglądać.
Można też użyć pętli for, jednak ja wolę taką konstrukcję.
Przydatne sznurki:
http://www.gentoo.org/doc/pl/articles/bash-by-example-p1.xml
http://www.gentoo.org/doc/pl/articles/bash-by-example-p2.xml
Działający przykład z cyklu: "jak z bieżących ustawień systemu wygenerować skrypta do użycia na innym kompie":
iptables -S | while read LINE; do echo "iptables -t filter $LINE"; done;
Pozdrawiam
;-)
Ostatnio edytowany przez Jacekalex (2012-12-09 10:43:46)
Offline
@prosze
Ogólnie chodzi o to, że wrzucam sobie skrypt do katalogu x, w którym są pliki do przerobienia (dowolne) i chcę, by ffmpeg zostawił mi w tym samym folderze pliki przerobione (niekoniecznie z rozszerzeniem = może być bez).
@azhag & Jacekalex
Dzięki, sprawdzę. Ewentualnie dam znać jeszcze w tym wątku.
EDIT
@azhag
Nie działa, zero efektu. Konsola nie zwraca wartości (jakichkolwiek).
@Jacekalex
Jest okay, spróbuję przekombinować to do pętli for.
EDIT2
Działa sposób azhag'a po małym liftingu. Dzięki.
Ostatnio edytowany przez PavloAkaLogan (2012-12-09 13:35:33)
Offline
Tutaj masz polecenie, które wystarczy wkleić w konsoli będąc w katalogu z plikami do konwertowania.
ls | awk -F. '/avi$/{system("ffmpeg -i "$0" -f avi -vcodec libxvid "$1"\".mpg\"")}'
Zarówno moje polecenie, jak i kolegi azhag działa tylko do plików avi. Możesz to zmienić w porosty sposób, podając rozszerzenie po kropce (na początku skryptu). Na przykład zmieniasz z /avi$/ na /mpg$/.
Ostatnio edytowany przez prosze (2012-12-09 13:51:11)
Offline
prosze: jest to jedna z najgorszych implementacji rozwiązania tego problemu, jakie można wymyślić.
Praca domowa: co się stanie, gdy plik będzie miał nazwę mój.film.z.wesela.Marysi.avi? A co gdy mój film z wesela Marysi.AVI?
Offline
Minio, a czy autor tematu wspominał, że w nazwach plików posiada znaki specjalne? Tutaj masz wersję, która poradzi sobie z Twoimi plikami wzorcowymi:
ls | awk '{a=substr($0,1,length($0)-4)}/avi$|AVI$/{system("ffmpeg -i "$0" -f avi -vcodec libxvid "a"\".mpg\"")}'
Offline
Ani kropka, ani spacja, nie są żadnymi „znakami specjalnymi”. Są dopuszczalne przez wszystkie nadal używane systemy plików. Ich obsługi w nazwach plików można oczekiwać od każdego istniejącego programu, gdyż to naprawdę elementarna kwestia. Autor nie musiał więc wspominać, jakie nazwy mają pliki, na których ma zamiar pracować.
Offline
Minio, nie zauważyłeś, że skrypt azhag też nie złapie jednego z Twoich plików wzorcowych? Czy to oznacza, że skrypt jest zły? Oczywiście, że nie. Oznacza to tylko tyle, że autor tematu powinien o tym fakcie napisać, aby odpowiadający mógł skrypt poprawić.
Teraz pytanie do ciebie. Co się stanie gdy rozszerzenie pliku będzie napisane w takiej formie: ".aVI”, ".AvI”,”.Avi” lub będzie zawierało białe znaki ".av i”?. Twoim zdaniem od razu należy pisać skrypt, który uwzględnia prawie wszystkie możliwości zapisu końcówki „.avi”?. Czy lepiej poczekać aż autor tematu wypowie się, czy w skrypcie coś należy poprawić?
Ostatnio edytowany przez prosze (2012-12-10 12:45:40)
Offline
prosze napisał(-a):
Minio, nie zauważyłeś, że skrypt azhag też nie złapie jednego z Twoich plików wzorcowych? Czy to oznacza, że skrypt jest zły? Oczywiście, że nie. Oznacza to tylko tyle, że autor tematu powinien o tym fakcie napisać, aby odpowiadający mógł skrypt poprawić.
Teraz pytanie do ciebie. Co się stanie gdy rozszerzenie pliku będzie napisane w takiej formie: ".aVI”, ".AvI”,”.Avi” lub będzie zawierało białe znaki ".av i”?. Twoim zdaniem od razu należy pisać skrypt, który uwzględnia prawie wszystkie możliwości zapisu końcówki „.avi”?. Czy lepiej poczekać aż autor tematu wypowie się, czy w skrypcie coś należy poprawić?
Głupoty pleciesz, łapie.
Offline
prosze napisał(-a):
Teraz pytanie do ciebie. Co się stanie gdy rozszerzenie pliku będzie napisane w takiej formie: ".aVI”, ".AvI”,”.Avi” lub będzie zawierało białe znaki ".av i”?
„.av i” nie jest poprawnym rozszerzeniem, więc ten przypadek można zignorować.
(Pomijając, że w ogóle identyfikowanie plików przez rozszerzenia jest głupotą. Ale z tym założeniem tutaj nie dyskutuję).
A co się stanie w tych przypadkach? Propozycja Jacekalex obsługuje je wszystkie. Propozycja azhaga wymaga dopisania trochę kodu, ale to nic trudnego.
prosze napisał(-a):
Twoim zdaniem od razu należy pisać skrypt, który uwzględnia prawie wszystkie możliwości zapisu końcówki „.avi”?
Tak. Rozszerzenie .avi można zapisać na 8 różnych sposobów. Obsługa ich wszystkich to nie jest coś szczególnie skomplikowanego.
Offline
A co się stanie w tych przypadkach? Propozycja Jacekalex obsługuje je wszystkie. Propozycja azhaga wymaga dopisania trochę kodu, ale to nic trudnego.
Przesada, moja propozycja ma jedną zasadniczą wadę, trzeba by tam wżenić `basename $PLIK` - żeby do ffmeg przekazywać ffmpeg --costam --cośtam -i ~/muza/$NAZWA -o ~/tam/rezultat/${NAZWA%.*}.ogg
Czyli coś w typie :
FOLDER='~/muza' DOCELOWY='~/gdzie.to/zrzucić' find $FOLDER -iname '*.mp3' |while read PLIK; NAZWA=`basename $PLIK`; ffmpeg --cośtam --cośtam -i $FOLDER/"$NAZWA" -o $DOCELOWY/${NAZWA%.*}.ogg ; done;
Oczywiście mając nadzieję, że konstrukcja ${NAZWA%.*} prawidłowo obetnie rozszerzenie z nazwy pliku zawierającej białe znaki, np spacje (w terminalu obrabia),
z którymi to spacjami w pętlach basha jest wieczny problem.
While proponuję dlatego, że find daje wynik 1 plik = 1 linia, a while przyjmuje do zmiennej linię po linii, podczas gdy for domyślnie każda spację traktuje jako znak nowego argumentu.
W dodatku wszystko "prof of concept" bo po prostu nie mam żadnego folderu z tonami muzy czy filmów do hurtowego konwertowania pod ręką.
Rozszerzenie? jak mamy różne pliki, najprostszy parametr do finda, ale można to zupełnie pominąć, ffmpeg i tak przekonwertuje tylko te formaty, które obsługuje i rozpozna, a wywali błąd, jak dostanie do konwersji np plik tekstowy do mp4. ;)
Pozdrawiam
;-)
Ostatnio edytowany przez Jacekalex (2012-12-10 19:01:09)
Offline
PavloAkaLogan napisał(-a):
Głupoty pleciesz, łapie.
To chyba mamy dwa różna skrypty.
Minio napisał(-a):
Propozycja azhaga wymaga dopisania trochę kodu, ale to nic trudnego.
Tak. Rozszerzenie .avi można zapisać na 8 różnych sposobów. Obsługa ich wszystkich to nie jest coś szczególnie skomplikowanego.
W takim razie proszę o propozycję Twojego skryptu. Chciałbym się czegoś nowego nauczyć.
Offline
Moja propozycja była prosta i wcale nie miała ambicji być jakimś uniwersalnym skryptem („z grubsza coś takiego”). W razie czego puknąć młotkiem, a nie czekać na synchronizację z satelitą. Po prostu uznałem (i kolega prosze chyba też), że jest to przypadek konwersji machnąć-i-zapomnieć. ;)
Co do obsłużenia dowolnego zapisu dowolnego rozszerzenia:
for ROZ in każde kolejne rozszerzenie pisane w DoWoLnY sPoSóB; do cośtam --z-naszym "plik.${ROZ}" done
Zresztą o co my się kłócimy? O to w którym sposobie trawa bardziej zielona? Pliki przekonwertowane, więc o co chodzi?
Dopisek: jeśli coś warte jest kłótni, to raczej pisownia nicków — np. mojego, w którym nie ma ani jednej wielkiej litery. ;)
Ostatnio edytowany przez azhag (2012-12-10 23:25:59)
Offline
Azhag, masz rację, że nie ma się o co sprzeczać. Na koniec jeszcze skrypt, który pobierze pliki bez względu na wielość liter w końcówce ".avi”.
ls | awk '{a=substr($0,1,length($0)-4)}/[aA][vV][iI]$/{system("ffmpeg -i "$0" -f avi -vcodec libxvid "a"\".mpg\"")}'
Offline
@azhag
Ja jeszcze zauważę, że niewiele znam filmów i piosenek, które nie miałyby spacji w nazwie, i dlatego mam zastrzeżenie do pętli for:
Find zwraca każdy wynik w nowej linni, i parsować ten wynik bezpieczniej jak linię, wycinąjąc całą nazwę pliku, bez względu na białe znaki.
I dlatego wynik for dający pliki Władca, Pierścieni, Dwie, Wieże.avi, albo while read line i basename zwracające plik "Władca Pierścieni - Dwie Wieże.avi" to zasadnicza różnica. :D
Polecam z resztą ten wątek celem wyjaśnienia. :D
Pozdrawiam
;-)
Ostatnio edytowany przez Jacekalex (2012-12-11 02:57:39)
Offline
Ja znam wiele takich. Niemniej:
azhag@debian /tmp % touch "Dupa Jasia.jpg" azhag@debian /tmp % touch "Dupa Kasi.jpg" azhag@debian /tmp % for file in *.jpg; do echo "lala $file dada"; done lala Dupa Jasia.jpg dada lala Dupa Kasi.jpg dada
Offline
Ok, postaram się sposób z pętlą for i białymi znakami wbić sobie do łba młotem kowalskim, bo jakoś mi to często nie wychodziło, jak chciałem. :D
Z while read COŚTAM za to samo chodzi, jak powinno, za każdym razem.
Np to polecenie (zrucenie reguł fw do skryptu), zawsze działa z while, za to z for, jakbym nie kombinował, zawsze wychodzi kaszanka. :)
iptables -S | while read LINE; do echo "iptables -t filter $LINE"; done;
Pozdrawiam
;-)
Ostatnio edytowany przez Jacekalex (2012-12-11 16:26:01)
Offline
Strony: 1