Cambiar el nombre de los archivos a subdirectorios

Cambiar el nombre de los archivos a subdirectorios

Estoy intentando cambiar el nombre de un montón de archivos con 'rename' y tengo mi expresión regular bien configurada:

rename --verbose --path 's|^\[(....)\](.*)\.(.*)|$2 ($1).$3|' *

Pero realmente me gustaría tener cada archivo colocado en un directorio con el inicio común, así que lo intenté rápidamente:

rename --verbose --path 's|^\[(....)\](.*)\.(.*)|$2 ($1)/$2 ($1).$3|' *

Pero eso se queja de que ninguno de los directorios existe (ya que no es así). ¿Me falta una bandera útil para cambiar el nombre o hay una mejor herramienta para esto?

Respuesta1

Si está utilizando un basado en Perl rename, entonces no hay nada que le impida llamar mkdir()para crear los directorios que faltan:

rename --verbose '
    s|^\[(....)\](.*)\.(.*)|$2 ($1)/$2 ($1).$3| &&
    mkdir("$2 ($1)")' *

Esta es la misma expresión Perl que usa, con una llamada agregada al mkdir()final para crear el directorio si la expresión coincide.

Si la sustitución original es correcta o no, o si tiene sentido, no lo sé (no sé qué tipos de nombres de archivos tienes). El punto es que dado que la expresión es una expresión Perl genérica, eres libre de usar cualquier código Perl, siempre y cuando $_(la variable predeterminada) esté configurada con el nombre del archivo resultante al final.

información relacionada