¿Secuencia de comandos para cambiar el nombre del archivo por lotes intercambiando subcadenas en el nombre del archivo?

¿Secuencia de comandos para cambiar el nombre del archivo por lotes intercambiando subcadenas en el nombre del archivo?

Tengo un grupo de archivos llamados comotítulo_diciembre_palabra1_palabra2.pngy desea iterar a través del directorio e intercambiar word1y word2dentro de cada archivo.

es decir, ir de"button_december_state_pressed.png" -> "button_december_pressed_state.png"

¿Alguna sugerencia sobre cómo podría lograr esto?

La mayoría de los programas por lotes que he encontrado para OS X no pueden especificar un carácter para dividir las palabras y esperaba que alguien pudiera ayudarme con un script rápido para resolver esto.

Respuesta1

Pruebe renameutil. Utiliza sedsintaxis para reemplazar nombres.

rename 's/old-name/new-name/' files

El comando se verá así

 rename 's/$(.*december_)(.*)_(.*)(.png)^/\1\3_\2\4/' *.png

Respuesta2

prueba el pequeñocambiar nombre-regex(sin instalación):

rr *_*_*_*.png "(.*)_(\w+)_(\w+).png" "$1_$3_$2.png"

Respuesta3

Editar: aquí hay un código por lotes para hacerlo. Copie este código y colóquelo en un archivo "Swap.bat".

@ECHO OFF

for %%a in (*.png) do (
     for /f "tokens=1,2,3,4 delims=_" %%b in ('echo %%~na') do (
        echo ren "%%a" "%%b_%%c_%%e_%%d%%~xa"))
Pause

Pongo un echoantes rende que puedas probar el código sin problema. Si la salida es correcta, retire elecho

Respuesta4

No es bonito, pero creo que hace lo que quieres si todos tus archivos están en la misma carpeta.

import os

files = os.listdir(os.getcwd())

[os.rename(i,
    '_'.join([i.split('_')[0],
        i.split('_')[1],
        i.split('_')[3][:-4],
        i.split('_')[2]+
        '.png'])) for i in files if len(i.split('_')) == 4 and i[-3:] == 'png']

¿O puedes usar formato y/o un bucle for?

for fileName in files:
    if fileName[-4:] == '.png':
        words = fileName[:-4].split('_')
        os.rename(fileName,
            '{0}_{1}_{2}_{3}.png'.format(words[0],
                words[1],
                words[3],
                words[2]))

información relacionada