Batch renomeia “case duplicates”

1

Eu tenho uma pasta no meu sistema Linux que é sincronizada com outros computadores, alguns deles com o Windows. O problema é que nessa pasta existem arquivos que são "duplicados de caso", ou seja, o nome do arquivo é o mesmo, exceto pelo fato de que um ou mais caracteres são maiúsculos e minúsculos. Para o sistema Linux, isso não é um problema, mas para o sistema Windows é e reclama de nomes de arquivos duplicados.

Existe um modo de linha de comando simples para localizar e substituir esses nomes de arquivos, algo como "converter todos os nomes de arquivos em minúsculas, se isso resultar em dois arquivos com o mesmo nome acrescentar '1' a um deles"?

    
por Benedikt Bauer 03.03.2015 / 21:11

1 resposta

1

Se você quiser evitar reinventar a roda, poderá usar a capacidade incorporada do comando mv para fazer backups numerados automaticamente; se o seu shell suportar a conversão de maiúsculas nativamente, isso pode ser tão simples quanto

for f in *; do mv --backup=numbered -- "$f" "${f,,}"; done

O formato do número de backup padrão é .~1~ , por exemplo, fornecido

SOME FILE  sOmE fIlE  some file

então

$ for f in *; do mv -v --backup=numbered -- "$f" "${f,,}"; done
‘SOME FILE’ -> ‘some file’ (backup: ‘some file.~1~’)
‘sOmE fIlE’ -> ‘some file’ (backup: ‘some file.~2~’)
mv: ‘some file’ and ‘some file’ are the same file

Se você não gosta da numeração padrão, você pode mudar isso depois do fato; se o seu sistema incluir o comando rename baseado em perl que poderia ser algo como

$ rename -v -- 's/\.~(\d+)~/$1/' *.~*~
some file.~1~ renamed as some file1
some file.~2~ renamed as some file2

finalmente dando

$ ls
some file  some file1  some file2
    
por 04.03.2015 / 00:07