Auteur Topic: rename script (maar dan anders dan al gedaan is).  (gelezen 6138 keer)

Offline zakhooi

  • Bedankjes
  • -Gegeven: 13
  • -Ontvangen: 1
  • Berichten: 182
rename script (maar dan anders dan al gedaan is).
« Gepost op: 20 januari 2015, 15:51:56 »
Hoi,

Ik ben op zoek naar een rename script.
Ik weet dat dit al besproken is, maar dat was i.h.k.v. NZB downloads.

Wat ik zoek is anders, ik wil:
- vanaf een bepaalt punt recursief karakters in bestandsnamen veranderen
- waarbij ik zelf aan kan geven welke kakarters ik met welke karakters wil vervangen.

Onder 'normaal' linux gebruik ik daarvoor het rename commando waarmee ik spaties vervang door underscores en dergelijke maar dat commando zit niet in busybox.
Als workaround zou ik de betreffende directory via SMB remote kunnen mounten aan een linux bak en dan alnog mijn script gebruiken, maar ik wil dit binnen de NAS zelf oplossen (mag via commandline).

Weet iemand hier een oplossing voor?

BVD
  • Mijn Synology: DS415play
  • HDD's: 2xWD20EFRX,1xWD40EFR

Ben(V)

  • Gast
Re: rename script (maar dan anders dan al gedaan is).
« Reactie #1 Gepost op: 20 januari 2015, 18:29:28 »
Ik kan je wel helpen aan een klein python scriptje die dit voor je doet.

Code: (python) [Selecteer]
import os

def replace_all(text, dic):
    for i, j in dic.iteritems():
        text = text.replace(i, j)
    return text

###########
# Main Program #
###########
path = '//NAS/sync/TvSeries'
replacedict = {' ' : '_','originaltekst2' : 'Replacedby2','originaltekst3' : 'Replacedby3' }

for dirpath, dirnames, filenames in os.walk(path):
    for filename in filenames:
        newfilespecs = dirpath + '/' + replace_all(filename,replacedict)
        oldfilespecs = dirpath + '/' + filename
        if newfilespecs != oldfilespecs :
            #os.rename(oldfilespecs, newfilespecs)
            print oldfilespecs + ' --> ' + newfilespecs
        else:
            print oldfilespecs +' --> Not renamed'

Je moet dan even het path aanpassen aan je eigen wensen en ook de replacedict.
Daar zet je strings paren in die vervangen moeten worden.

Ik heb de echte rename regel even van een kommentaar karaakter voorzien (het #) dan kun je eerst uittesten of alles wel goed gaat voor je hem echt laat renamen.

PS uiteraard moet je wel python geinstalleerd hebben en het script met python aanroepen.

Offline zakhooi

  • Bedankjes
  • -Gegeven: 13
  • -Ontvangen: 1
  • Berichten: 182
Re: rename script (maar dan anders dan al gedaan is).
« Reactie #2 Gepost op: 20 januari 2015, 19:16:31 »
Dat is een mooi begin, bedankt!

Ik ben er nu naar aan het kijken. Ik ben bash gewend en doe niets met python dus heb nog wel een paar vragen.
- In replacedict hoe vervang ik een "'" met niets? dan krijg je 3x "'" achter elkaar (''') en dat snapt python niet.
- En wat is 'niets'? Kan ik dan gewoon 2x "'" achter elkaar gebruiken ('')?
- Zijn er ook karakters die geescaped moeten worden of hoeft dat niet onder python?

Met rename verander ik de volgende karakters (daar zoek ik nu dus een python equivalent voor):
rename "s/\(/\[/g" */*
rename "s/\)/\]/g" */*
rename "s/\ /_/g" */*
rename "s/\'//g" */*
rename "s/\&//g" */*
rename "s/\$//g" */*
rename "s/\@//g" */*
rename "s/\!//g" */*
rename "s/\`//g" */*
rename "s/\~//g" */*
rename "s/\+//g" */*
rename "s/\,//g" */*
  • Mijn Synology: DS415play
  • HDD's: 2xWD20EFRX,1xWD40EFR

Ben(V)

  • Gast
Re: rename script (maar dan anders dan al gedaan is).
« Reactie #3 Gepost op: 20 januari 2015, 20:23:21 »
Hier de regel die je kunt opnemen als replacedict.
Het mag ook gewoon op een regel, maar voor het overzicht heb ik de karakters even recht onder elkaar gezet.
En het vervangen met niets doe je achter de dubbele punt twee hoge quotes met niets ertussen op te nemen.

Code: (python) [Selecteer]
replacedict = {'(' : '[',
               ')' : ']',
               ' ' : '_',
               '\'' : '',
               '&' : '',
               '$' : '',
               '@' : '',
               '!' : '',
               '`' : '',
               '~' : '',
               '+' : '',
               ',' : '',}

Je kunt die hoge quote toevoegen door er het escape karakter (de \) ervoor te zetten of die hoge quote tussen dubbele quotes te zetten.  Dus ofwel '\'' ofwel "'" .

Offline zakhooi

  • Bedankjes
  • -Gegeven: 13
  • -Ontvangen: 1
  • Berichten: 182
Re: rename script (maar dan anders dan al gedaan is).
« Reactie #4 Gepost op: 20 januari 2015, 20:34:32 »
Ok hij doet het al best aardig.
Hij neemt alleen de directories zelf niet mee in het renamen.
Is dat een eenvoudige aanpassing? Hoe zou het script er dan uit zien?
  • Mijn Synology: DS415play
  • HDD's: 2xWD20EFRX,1xWD40EFR

Ben(V)

  • Gast
Re: rename script (maar dan anders dan al gedaan is).
« Reactie #5 Gepost op: 20 januari 2015, 20:51:59 »
Ja gewoon nog een for loop op nemen die door de directories loopt zoals hieronder.

Code: (pytho) [Selecteer]
for dirpath, dirnames, filenames in os.walk(path):
    for dirname in dirnames:
        newdirspecs = dirpath + '/' + replace_all(dirname,replacedict)
        olddirspecs = dirpath + '/' + dirname
        if newdirspecs != olddirspecs :
            os.rename(olddirspecs, newdirspecs)
            print olddirspecs + ' --> ' + newfilespecs
        else:
            print olddirspecs +' --> Not renamed'
    for filename in filenames:
        newfilespecs = dirpath + '/' + replace_all(filename,replacedict)
        oldfilespecs = dirpath + '/' + filename
        if newfilespecs != oldfilespecs :
            #os.rename(oldfilespecs, newfilespecs)
            print oldfilespecs + ' --> ' + newfilespecs
        else:
            print oldfilespecs +' --> Not renamed'


PS wel even testen hoor, want ik schrijf dit uit m'n hoofd zonder het uit te testen.


Offline zakhooi

  • Bedankjes
  • -Gegeven: 13
  • -Ontvangen: 1
  • Berichten: 182
Re: rename script (maar dan anders dan al gedaan is).
« Reactie #6 Gepost op: 20 januari 2015, 21:07:13 »
Je had er nog 1 foutje inzitten (newfilespecs ipv newdirspecs), maar nadat ik die eruit heb gehaald werkt het renamen van directories nog niet. Het script draait en genereert output maar in de nieuwe naam staat nog de ongewijzigde naam.

het script ziet er nu zo uit (daadwerkelijk renamen nog uitgehashed).

import os

def replace_all(text, dic):
    for i, j in dic.iteritems():
        text = text.replace(i, j)
    return text

###########
# Main Program #
###########
path = '.'
replacedict = {'(' : '[',
               ')' : ']',
               ' ' : '_',
               '\'' : '',
               '&' : '',
               '$' : '',
               '@' : '',
               '!' : '',
               '`' : '',
               '~' : '',
               '+' : '',
               ',' : '',}

for dirpath, dirnames, filenames in os.walk(path):
    for dirname in dirnames:
        newdirspecs = dirpath + '/' + replace_all(dirname,replacedict)
        olddirspecs = dirpath + '/' + dirname
        if newdirspecs != olddirspecs :
            #os.rename(olddirspecs, newdirspecs)
            print olddirspecs + ' --> ' + newdirspecs
        else:
            print olddirspecs +' --> Not renamed'
    for filename in filenames:
        newfilespecs = dirpath + '/' + replace_all(filename,replacedict)
        oldfilespecs = dirpath + '/' + filename
        if newfilespecs != oldfilespecs :
            #os.rename(oldfilespecs, newfilespecs)
            print oldfilespecs + ' --> ' + newfilespecs
        else:
            print oldfilespecs +' --> Not renamed'
  • Mijn Synology: DS415play
  • HDD's: 2xWD20EFRX,1xWD40EFR

Ben(V)

  • Gast
Re: rename script (maar dan anders dan al gedaan is).
« Reactie #7 Gepost op: 20 januari 2015, 21:20:25 »
Vreemd dat hij het bij jouw niet doet.
Heb het maar even op m'n PC geprobeert en dan krijg ik dit als resultaat.
Zit niet zo veel renames in maar een paar spaties zijn toch veranderd.

14588-0

Offline zakhooi

  • Bedankjes
  • -Gegeven: 13
  • -Ontvangen: 1
  • Berichten: 182
Re: rename script (maar dan anders dan al gedaan is).
« Reactie #8 Gepost op: 20 januari 2015, 21:24:04 »
Ja maar dat zijn filerenames, die doen het wel, wat ik aan gaf is dat de directories niet gerenamed worden.
  • Mijn Synology: DS415play
  • HDD's: 2xWD20EFRX,1xWD40EFR

Ben(V)

  • Gast
Re: rename script (maar dan anders dan al gedaan is).
« Reactie #9 Gepost op: 20 januari 2015, 21:25:47 »
Die allereerste is een directory.
Je kunt dat alleen niet zien.

Als je dat beter wilt zien moet je de print statments even aanpassen door er Dir Rename: en File Rename: bij te zetten of zo iets.
Code: (python) [Selecteer]
for dirpath, dirnames, filenames in os.walk(path):
    for dirname in dirnames:
        newdirspecs = dirpath + '/' + replace_all(dirname,replacedict)
        olddirspecs = dirpath + '/' + dirname
        if newdirspecs != olddirspecs :
            #os.rename(olddirspecs, newdirspecs)
            print "Dir Rename: " + olddirspecs + ' --> ' + newdirspecs
        else:
            print "Dir Rename: "+olddirspecs +' --> Not renamed'
    for filename in filenames:
        newfilespecs = dirpath + '/' + replace_all(filename,replacedict)
        oldfilespecs = dirpath + '/' + filename
        if newfilespecs != oldfilespecs :
            #os.rename(oldfilespecs, newfilespecs)
            print "File Rename: " + oldfilespecs + ' --> ' + newfilespecs
        else:
            print "File Rename: " + oldfilespecs +' --> Not renamed'

Offline zakhooi

  • Bedankjes
  • -Gegeven: 13
  • -Ontvangen: 1
  • Berichten: 182
Re: rename script (maar dan anders dan al gedaan is).
« Reactie #10 Gepost op: 20 januari 2015, 21:36:36 »
Aha, ik zie het al, hij doet eerst alle dirs en daarna alle files.
Dat lijkt nu goed, echter ..... Voor het renamen van files in subdirs pakt hij nog de ongewijzigde dirnamen die echter vlak daarvoor net gewijzigd zijn.

:/
  • Mijn Synology: DS415play
  • HDD's: 2xWD20EFRX,1xWD40EFR

Ben(V)

  • Gast
Re: rename script (maar dan anders dan al gedaan is).
« Reactie #11 Gepost op: 20 januari 2015, 21:48:13 »
Hmm das een lastige.

Even nagedacht en de oplossing is eerst de files te doen en daarna de directories pas.

dus zo:
Code: (python) [Selecteer]
for dirpath, dirnames, filenames in os.walk(path):
    for filename in filenames:
        newfilespecs = dirpath + '/' + replace_all(filename,replacedict)
        oldfilespecs = dirpath + '/' + filename
        if newfilespecs != oldfilespecs :
            #os.rename(oldfilespecs, newfilespecs)
            print "File Rename: " + oldfilespecs + ' --> ' + newfilespecs
        else:
            print "File Rename: " + oldfilespecs +' --> Not renamed'
    for dirname in dirnames:
        newdirspecs = dirpath + '/' + replace_all(dirname,replacedict)
        olddirspecs = dirpath + '/' + dirname
        if newdirspecs != olddirspecs :
            #os.rename(olddirspecs, newdirspecs)
            print "Dir Rename: " + olddirspecs + ' --> ' + newdirspecs
        else:
            print "Dir Rename: "+olddirspecs +' --> Not renamed'

Offline zakhooi

  • Bedankjes
  • -Gegeven: 13
  • -Ontvangen: 1
  • Berichten: 182
Re: rename script (maar dan anders dan al gedaan is).
« Reactie #12 Gepost op: 20 januari 2015, 21:57:55 »
Dat werkt ook niet, volgens mij komt dat omdat hij de directorynamen pakt van voordat hij met renamen begint.
  • Mijn Synology: DS415play
  • HDD's: 2xWD20EFRX,1xWD40EFR

Ben(V)

  • Gast
Re: rename script (maar dan anders dan al gedaan is).
« Reactie #13 Gepost op: 20 januari 2015, 22:22:13 »
Ik denk dat hij het wel doet.
Het probleem is dat hij bij je test natuurlijk niet echt renamed.

Je zou even een aantal test directories en files moeten maken om het echt te kunnen testen.

Als het echt niet werkt moet ik iets bedenken om het bottum up te doen in plaats van top down.

Ik moet nu stoppen maar als je er niet uit komt, laat het even weten dan regel ik het morgen even.

Offline zakhooi

  • Bedankjes
  • -Gegeven: 13
  • -Ontvangen: 1
  • Berichten: 182
Re: rename script (maar dan anders dan al gedaan is).
« Reactie #14 Gepost op: 21 januari 2015, 06:04:10 »
nog even getest met een paar test dirs en files (tot 2 niveaus diep).
Hij doet het wel, maar niet recursief.

python ./renall.py
File Rename: ./renall.py --> Not renamed
File Rename: ./file level 0 --> ./file_level_0
Dir Rename: ./level 0 dir 1 --> ./level_0_dir_1
Dir Rename: ./level 0 dir 2 --> ./level_0_dir_2
  • Mijn Synology: DS415play
  • HDD's: 2xWD20EFRX,1xWD40EFR


 

Sonarr rename?

Gestart door ppeeters11Board Overige 3rd party packages

Reacties: 1
Gelezen: 908
Laatste bericht 15 februari 2017, 16:47:44
door proxydude
Folder rename

Gestart door rjozzieBoard SABnzbd (usenet)

Reacties: 2
Gelezen: 1619
Laatste bericht 15 augustus 2013, 12:52:05
door rjozzie
rename en clean

Gestart door stefsegersBoard Download Station

Reacties: 0
Gelezen: 1003
Laatste bericht 26 juli 2016, 15:38:19
door stefsegers
Kan bij rename geen FROM en TO folder instellen.

Gestart door rjozzieBoard CouchPotato

Reacties: 3
Gelezen: 1978
Laatste bericht 09 juli 2013, 19:04:28
door TonVH
Hulp gevraagd: pytonscript om filenames om te draaien (reverse rename).

Gestart door zakhooiBoard Synology DSM 5.1 en eerder

Reacties: 20
Gelezen: 14353
Laatste bericht 17 maart 2016, 21:52:32
door Hutje