[bash] skrypt zmieniający nazwy plików
-
- Piegowaty Guziec
- Posty: 3
- Rejestracja: 08 lut 2008, 16:36
- Płeć: Mężczyzna
- Wersja Ubuntu: 9.04
- Środowisko graficzne: GNOME
[bash] skrypt zmieniający nazwy plików
Witam, jestem początkujacy jeżeli chodzi o te klocki, chciałbym sobie napisać skrypt , który by zmienił nazwę danego pliku/plików w/g schematu. Chodzi mi np. o wideo z odcinkami seriali, powiedzmy że będziemy zmieniać tylko pliki serialu californication. Pliki ściągnięte przeze mnie mają format <nazwa serialu>??S<numer sezonu>??E<numer epizodu>??<jakies znaki>.avi . W miejscach ?? mogą być jakieś znaki, np. podkreslniki albo kropki lub spacje. I teraz ja bym chciał zeby skrypt zmienił mi nazwę np. pliku Californication.S01.E01.NOTV-LOL.avi na Californication 01x01.avi. Proszę o jakąś pomoc, jednocześnie nauczę się czegoś z basha, a prawdę mówiąc nie wiem z czego tu korzystać czy z grepa a moze jakiegos sed'a.
-
- Sędziwy Jeż
- Posty: 74
- Rejestracja: 19 paź 2009, 18:59
- Płeć: Mężczyzna
- Wersja Ubuntu: 10.10
- Środowisko graficzne: GNOME
- Architektura: x86_64
Odp: [bash] skrypt zmieniający nazwy plików
Nie jestem specem w bash, ale działa:
Jeśli chcesz zmienić budowę nazw, musisz to zrobić w 3 miejscach.
Uważaj, bo skrypt zmienia nazwy i na nic nie patrzy, kiedyś zmieniałem w podobny sposób nazwy zdjęć i przez pomyłkę nadpisywały się kolejno na siebie i wszystkie straciłem
Pytaj, jeśli czegoś nie rozumiesz.
PS.: jeśli nie masz jakiegoś odcinka to skrypt przestanie działać, tzn. muszą być kolejne numerki
Kod: Zaznacz cały
#!/bin/bash
sezon=1
odcinek=1
if [ $[sezon] -gt 9 ]
then
nazwa_sezon=$sezon
else
nazwa_sezon=0$sezon
fi
if [ $[odcinek] -gt 9 ]
then
nazwa_odcinek=$odcinek
else
nazwa_odcinek=0$odcinek
fi
while [ -e Californication.S$nazwa_sezon"".E$nazwa_odcinek"".NOTV-LOL.avi ]
do
while [ -e Californication.S$nazwa_sezon"".E$nazwa_odcinek"".NOTV-LOL.avi ]
do
mv Californication.S$nazwa_sezon"".E$nazwa_odcinek"".NOTV-LOL.avi Californication\ $nazwa_sezon""x$nazwa_odcinek"".avi
odcinek=$[odcinek+1]
if [ $[odcinek] -gt 9 ]
then
nazwa_odcinek=$odcinek
else
nazwa_odcinek=0$odcinek
fi
done
sezon=$[sezon+1]
odcinek=1
if [ $[sezon] -gt 9 ]
then
nazwa_sezon=$sezon
else
nazwa_sezon=0$sezon
fi
if [ $[odcinek] -gt 9 ]
then
nazwa_odcinek=$odcinek
else
nazwa_odcinek=0$odcinek
fi
done
Uważaj, bo skrypt zmienia nazwy i na nic nie patrzy, kiedyś zmieniałem w podobny sposób nazwy zdjęć i przez pomyłkę nadpisywały się kolejno na siebie i wszystkie straciłem

Pytaj, jeśli czegoś nie rozumiesz.
PS.: jeśli nie masz jakiegoś odcinka to skrypt przestanie działać, tzn. muszą być kolejne numerki

-
- Piegowaty Guziec
- Posty: 3
- Rejestracja: 08 lut 2008, 16:36
- Płeć: Mężczyzna
- Wersja Ubuntu: 9.04
- Środowisko graficzne: GNOME
Odp: [bash] skrypt zmieniający nazwy plików
Generalnie ograniam to
, tylko jedno pytank bo wiadomo nie każdy plik będzie się kończył NOTV-LOL.avi np. drugi odcinek może mieć coś innego na końcu pliku. Stąd moje pytanie jak się zapytać czy istnieje plik który zaczyna się Californication.S01.E02*.avi, gdzie * oznacza dowolne znaki, i najlepiej zeby odrazu byla wyswietlona nazwa takiego pliku, to juz pewnie jakos grep'em trzeba...
PS. Wielkie dzieki za skrypt.

PS. Wielkie dzieki za skrypt.
-
- Sędziwy Jeż
- Posty: 74
- Rejestracja: 19 paź 2009, 18:59
- Płeć: Mężczyzna
- Wersja Ubuntu: 10.10
- Środowisko graficzne: GNOME
- Architektura: x86_64
Odp: [bash] skrypt zmieniający nazwy plików
Muszę to przemyśleć, w bash'u jestem cienki:razz:
Popróbuj sam, może do czegoś dojdziesz.
Popróbuj sam, może do czegoś dojdziesz.
-
- Sędziwy Jeż
- Posty: 65
- Rejestracja: 11 gru 2008, 11:20
- Płeć: Mężczyzna
- Wersja Ubuntu: 10.04
- Środowisko graficzne: GNOME
- Architektura: x86
Odp: [bash] skrypt zmieniający nazwy plików
Może sprobować tym kierunku:
lub cos troche bardziej skomplikowanego:
Wyrazenia regularne (man perlre) - dobra rzecz.
Kod: Zaznacz cały
otokan@ubu:/tmp$ rename -n 's!^(.*\w).*S(\d+).*E(\d+).*\.avi$!$1 ${2}x${3}.avi!' *.avi
Californication.S01.E01.NOTV-LOL.avi renamed as Californication 01x01.avi
Californication.S1.E3.NOTV-LOL.avi renamed as Californication 1x3.avi
Kod: Zaznacz cały
otokan@ubu:/tmp$ rename -n \
's!^(.*\w).*S(\d+).*E(\d+).*\.avi$!sprintf("%s %02dx%02d.avi",$1,$2,$3)!e' *.avi
Californication.S01.E01.NOTV-LOL.avi renamed as Californication 01x01.avi
Californication.S1.E3.NOTV-LOL.avi renamed as Californication 01x03.avi
-
- Sędziwy Jeż
- Posty: 74
- Rejestracja: 19 paź 2009, 18:59
- Płeć: Mężczyzna
- Wersja Ubuntu: 10.10
- Środowisko graficzne: GNOME
- Architektura: x86_64
Odp: [bash] skrypt zmieniający nazwy plików
Wybacz Otokan, ale nie rozumiem tego:( Może by to dużo ułatwiło, ale zrobiłem po swojemu:
Teraz zmienia nazwę dla dowolnej końcówki, jeśli jest więcej niż jeden taki plik, wyświetli komunikat. Wystarczy już tylko raz napisać wzór dla plików źródłowych i wynikowych
Pewnie osoby znające się na tym lepiej wyrywają sobie włosy z głów, ale ja takie rozwiązanie rozumiem i mi się podoba:craz:
W każdym razie działa
PS.: mogą być błędy
Kod: Zaznacz cały
#!/bin/bash
sezon=1
odcinek=1
poczatek="Californication.S"
srodek=".E"
koniec=""
#budowa nazwy: $poczatek$numer_sezonu$srodek$numer_odcinka$koniec
if [ $[sezon] -gt 9 ]
then
nazwa_sezon=$sezon
else
nazwa_sezon=0$sezon
fi
if [ $[odcinek] -gt 9 ]
then
nazwa_odcinek=$odcinek
else
nazwa_odcinek=0$odcinek
fi
nazwa="$poczatek""$nazwa_sezon""$srodek""$nazwa_odcinek""$koniec"
ilosc=`ls *.avi | grep -c $nazwa`
ilosc=$[ilosc]
while [ $ilosc -ge 1 ]
do
while [ $ilosc -ge 1 ]
do
if [ $ilosc == 1 ]
then
nazwa_pliku=`ls *.avi | grep $nazwa`
#Tu zmień wzór plików wynikowych
mv $nazwa_pliku Californication\ $nazwa_sezon""x$nazwa_odcinek"".avi
else
echo dla pliku początku nazw $nazwa jest więcej niż jeden plik\! musisz zrobić to ręcznie
fi
odcinek=$[odcinek+1]
if [ $[odcinek] -gt 9 ]
then
nazwa_odcinek=$odcinek
else
nazwa_odcinek=0$odcinek
fi
nazwa="$poczatek""$nazwa_sezon""$srodek""$nazwa_odcinek""$koniec"
ilosc=`ls *.avi | grep -c $nazwa`
ilosc=$[ilosc]
done
sezon=$[sezon+1]
odcinek=1
if [ $[sezon] -gt 9 ]
then
nazwa_sezon=$sezon
else
nazwa_sezon=0$sezon
fi
if [ $[odcinek] -gt 9 ]
then
nazwa_odcinek=$odcinek
else
nazwa_odcinek=0$odcinek
fi
nazwa="$poczatek""$nazwa_sezon""$srodek""$nazwa_odcinek""$koniec"
ilosc=`ls *.avi | grep -c $nazwa`
ilosc=$[ilosc]
done
Pewnie osoby znające się na tym lepiej wyrywają sobie włosy z głów, ale ja takie rozwiązanie rozumiem i mi się podoba:craz:
W każdym razie działa
PS.: mogą być błędy
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 10 gości