¿Cómo puedo cambiar el nombre de lote de archivos?
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
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