windows - Hvordan kan jeg batch omdøbe filer?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg søger et script (Perl, Python eller batch ville være fint), der går gennem et udpeget filtræ og omdøber alle børnefiler.


For eksempel bliver Folder1>File1.anytype Folder1>Folder1File1.anytype.


Tak

Bedste reference


Du nævner en batch-fil, hvilket sandsynligvis betyder at du er på Windows (jeg antager, at du henviser til en .bat-fil). Hvis du er på et unix-system, giv det et skud:


find . -mindepth 2 -type f -exec sh -c "mv {} `dirname {}`/`dirname {} | sed 's/^.//' | sed 's////g'``basename {}`" ;


Alternativt kan dette Python 3-program gøre tricket (skal også arbejde på Windows ...):


#!/usr/bin/env python3.0

import os
import sys 

def raise\_error(e):
    raise e

def full\_split(path):
    head, tail = os.path.split(path)

    if head:
        return full\_split(head) + [tail]

    return [tail]

def main(args):
    if len(args) != 1:
         print("Please specify one target directory", file=sys.stderr)
         sys.exit(1)

    os.chdir(args[0])
    for dirpath, \_, filenames in os.walk('.', onerror=raise\_error):
        for f in filenames:
            old = os.path.join(dirpath, f)
            new = os.path.join(dirpath, ''.join(full\_split(dirpath[2:]) + [f]))
            os.rename(old, new)

if \_\_name\_\_ == '\_\_main\_\_':
    main(sys.argv[1:])


Mappen layout før:


.:
Abc  Def

./Abc:
Foo2.bar  Foo.bar

./Def:
Baz2.quux  Baz.quux  Ghi

./Def/Ghi:
Bar2.foo  Bar.foo


Mappen layout efter:


.:
Abc  Def

./Abc:
AbcFoo2.bar  AbcFoo.bar

./Def:
DefBaz2.quux  DefBaz.quux  Ghi

./Def/Ghi:
DefGhiBar2.foo  DefGhiBar.foo

Andre referencer 1


Den bedste batch renamer er mmv. [10]


Og se også Hvordan man laver en masse omdøb?

Andre referencer 2


du kan prøve at batchrename: http://batchrename.foryoursoft.com/[12]

Andre referencer 3


Du kan opnå sådanne omdøbere ved at bruge en nested for loop på kommandolinjen .. omend lidt grim:


for /D \%d in (*) do for \%f in ("\%d*.*") do move "\%f" "\%d\%~nd\%~nf"


Hvis du ønsker at sætte ovenstående kommando i et batch script, skal du gentage hver\% tegn én gang.


for /D \%\%d in (*) do for \%\%f in ("\%\%d*.*") do move "\%\%f" "\%\%d\%\%~nd\%\%~nf"


For at forstå, hvad ovenstående kommando gør, skal du konsultere FOR /? på kommandolinjen.


Jeg har lyst til at Batch er så bitter i disse dage, jeg har brug for at bevare BAT visdom på en eller anden måde :-)


Jeg kidding :-) .. men kommandoen virker, jeg har prøvet det.

Andre referencer 4


Pretty trivial i Perl ved hjælp af File :: Find and File :: Kopier [13] [14]