Renomeie arquivos em subdiretórios

Renomeie arquivos em subdiretórios

Estou tentando renomear vários arquivos com 'renomear' e tenho meu regex bem configurado:

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

Mas eu realmente gostaria que cada arquivo fosse colocado em um diretório com início comum, então tentei:

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

Mas isso reclama que nenhum dos diretórios existe (como não existe). Estou faltando um sinalizador útil para renomear ou é uma ferramenta melhor para isso?

Responder1

Se você estiver usando um arquivo baseado em Perl rename, nada o impedirá de chamar mkdir()para criar os diretórios ausentes:

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

Esta é a mesma expressão Perl que você usa, com uma chamada adicionada mkdir()no final para criar o diretório se a expressão corresponder.

Se a substituição original está correta ou não, ou se faz sentido, não sei (não sei que tipos de nomes de arquivos você possui). A questão é que, como a expressão é uma expressão Perl genérica, você está livre para usar qualquer código Perl, desde que $_(a variável padrão) esteja definida como o nome do arquivo resultante no final.

informação relacionada