Pregunta

Estoy buscando un script (Perl, Python o lote estaría bien) que pasará a través de un árbol de archivos designado y cambia el nombre de todos los archivos secundarios.

Por ejemplo, se convierte en Folder1>File1.anytype Folder1>Folder1File1.anytype.

Gracias

¿Fue útil?

Solución

Usted menciona un archivo por lotes, lo que probablemente significa que usted está en Windows (supongo que se refieren a un archivo .bat). Si estás en un sistema UNIX, dar a este un tiro:

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

Por otra parte, este programa Python 3 puede hacer el truco (también debería funcionar en 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:])

La estructura de directorios antes:

.:
Abc  Def

./Abc:
Foo2.bar  Foo.bar

./Def:
Baz2.quux  Baz.quux  Ghi

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

La estructura de directorios después de:

.:
Abc  Def

./Abc:
AbcFoo2.bar  AbcFoo.bar

./Def:
DefBaz2.quux  DefBaz.quux  Ghi

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

Otros consejos

La mejor Renamer lote es MMV .

Y véase también Cómo hacer una masa cambiar el nombre?

usted podría darle una oportunidad a BatchRename: http://batchrename.foryoursoft.com/

Puede conseguir estos cambios de nombre mediante el uso de un bucle anidado para la línea de comandos .. aunque un poco fea:

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

Si desea poner el comando anterior en un archivo por lotes, repetir cada vez que los caracteres%.

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

Para entender lo que el comando anterior, consulte FOR /? en la línea de comandos.

Me siento como lote es tan arcano en estos días que necesitan para preservar la sabiduría MTD de alguna manera ...: -)

Es broma :-) .. pero el comando funciona, lo he intentado.

Pretty trivial en Perl usando File :: Encuentra y archivo :: Copiar

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top