Zmiana nazwy wielu plików z użyciem jednego polecenia i wyrażeń regularnych oraz find

Daniel Dawid Majewski doctorque w o2.pl
Pon, 5 Paź 2009, 13:19:42 CEST


Chciałbym uzyskać w jednym poleceniu masową zamianę nazw typu :
Seria plików [6x01] tytuł pierwszy (Zbędny tekst).txt -> Seria.plików.S06T01.tytuł pierwszy.txt
...
Seria plików [6x09] stach dziewiąty (Zbędny tekst).txt -> Seria.plików.S06T09.stach dziewiąty.txt
Seria plików [6x10] potomek dziesiąty (Zbędny tekst).txt -> Seria.plików.S06T10.potomek dziesiąty.txt
Seria plików [6x11] tytuł jedenasty (Zbędny tekst).txt -> Seria.plików.S06T11.tytuł jedenasty.txt
lista plików :
$ ls *6x*.txt
Seria plików [6x01] tytuł pierwszy (Zbędny tekst).txt  Seria plików [6x07] tytuł siódmy (Zbędny tekst).txt
Seria plików [6x02] tytuł drugi (Zbędny tekst).txt     Seria plików [6x08] tytuł ósmy (Zbędny tekst).txt
Seria plików [6x03] tytuł trzeci (Zbędny tekst).txt    Seria plików [6x09] stach dziewiąty (Zbędny tekst).txt
Seria plików [6x04] tytuł czwarty (Zbędny tekst).txt   Seria plików [6x10] potomek dziesiąty (Zbędny tekst).txt
Seria plików [6x05] tytuł piąty (Zbędny tekst).txt     Seria plików [6x11] tytuł jedenasty (Zbędny tekst).txt
Seria plików [6x06] tytuł szósty (Zbędny tekst).txt
Stworzyłem następujące polecenie wyświetlające prawidłowo zmienione nazwy :
$ find -name '*6x*.txt' | sed -e 's;\(Seria\)\s\(plików\)\s\[6x\([[:digit:]]\{2\}\)\]\s\(.*\)\s(Z.*t);\1.\2.S06T\3.\4;'
| sort
./Seria.plików.S06T01.tytuł pierwszy.txt
./Seria.plików.S06T02.tytuł drugi.txt
./Seria.plików.S06T03.tytuł trzeci.txt
./Seria.plików.S06T04.tytuł czwarty.txt
./Seria.plików.S06T05.tytuł piąty.txt
./Seria.plików.S06T06.tytuł szósty.txt
./Seria.plików.S06T07.tytuł siódmy.txt
./Seria.plików.S06T08.tytuł ósmy.txt
./Seria.plików.S06T09.stach dziewiąty.txt
./Seria.plików.S06T10.potomek dziesiąty.txt
./Seria.plików.S06T11.tytuł jedenasty.txt
Nie mogę sobie natomiast poradzić z użyciem tego do zmiany nazwy, polecenie wywala się na spacjach :
$ find -name '*6x*.txt' -exec bash -c 'mv "{}" $(echo "{}" | sed -e
"s;\(Seria\)\s\(plików\)\s\[6x\([[:digit:]]\{2\}\)\]\s\(.*\)\s(Z.*t);\1.\2.S06T\3.\4;")' ';'
mv: cel `trzeci.txt' nie jest katalogiem
mv: cel `piąty.txt' nie jest katalogiem
mv: cel `dziewiąty.txt' nie jest katalogiem
mv: cel `dziesiąty.txt' nie jest katalogiem
mv: cel `czwarty.txt' nie jest katalogiem
mv: cel `siódmy.txt' nie jest katalogiem
mv: cel `drugi.txt' nie jest katalogiem
mv: cel `jedenasty.txt' nie jest katalogiem
mv: cel `pierwszy.txt' nie jest katalogiem
mv: cel `ósmy.txt' nie jest katalogiem
mv: cel `szósty.txt' nie jest katalogiem
Próbowałem też rename ale bez rezultatów :
$ find -name '*6x*.txt' -exec rename
's;\(Seria\)\s\(plików\)\s\[6x\([[:digit:]]\{2\}\)\]\s\(.*\)\s(Z.*t);\1.\2.S06T\3.\4;' "'{}'" ';'

Co robię źle ?
-- 
Pozdrawiam,
Daniel Dawid Majewski
jabber:light-i/jid.pl





Więcej informacji o liście dyskusyjnej pld-users-pl