[bash] skrypt zmieniający nazwy plików

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
sebapawlak
Piegowaty Guziec
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

Post autor: sebapawlak »

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.
Appleman
Sędziwy Jeż
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

Post autor: Appleman »

Nie jestem specem w bash, ale działa:

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
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 ;-)
sebapawlak
Piegowaty Guziec
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

Post autor: sebapawlak »

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.
Appleman
Sędziwy Jeż
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

Post autor: Appleman »

Muszę to przemyśleć, w bash'u jestem cienki:razz:
Popróbuj sam, może do czegoś dojdziesz.
otokan
Sędziwy Jeż
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

Post autor: otokan »

Może sprobować tym kierunku:

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
lub cos troche bardziej skomplikowanego:

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
Wyrazenia regularne (man perlre) - dobra rzecz.
Appleman
Sędziwy Jeż
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

Post autor: Appleman »

Wybacz Otokan, ale nie rozumiem tego:( Może by to dużo ułatwiło, ale zrobiłem po swojemu:

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
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:grin:
PS.: mogą być błędy
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

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