lote-renomeie nomes de arquivos com números para ordenar alfabeticamente

2

Eu quero renomear em lote arquivos contendo números, preenchendo os números com zeros. O objetivo é classificar conjuntos numerados de arquivos em ordem alfabética na ordem correta em qualquer aplicativo.

Em um conjunto de arquivos com o mesmo texto de prefixo seguido por um número, quero preencher cada número com tantos zeros quantos o maior número tiver dígitos.

Ou seja, uma lista de arquivos com nomes como este:

xx 1 abc.txt
xx 2 def.txt
xx 3 ghi.txt
xx 3.5 jkl.txt
xx 4a mno.txt
xx 4b pqr.txt
...
xx 100 end.txt

deve se tornar:

xx 001 abc.txt
xx 002 def.txt
xx 003 ghi.txt
xx 003.5 jkl.txt
xx 004a mno.txt
xx 004b pqr.txt
...
xx 100 end.txt

(o sistema é o Windows XP)

(o Windows Explorer usa algum tipo de heurística para ordenar arquivos com números dessa forma, nem sempre corretamente. No entanto, estou procurando uma maneira de realmente renomear os arquivos )

Adendo

Eu me referi a essa pergunta como uma possível duplicata: Como posso renomear arquivos em massa? As ferramentas mencionadas lá (Bulk Rename Utility, AntRenamer, Free Commander Portable etc.) são, até onde eu sei, incapazes de detectar a quantidade mínima de paddding necessária para cada conjunto de arquivos.

Meu raciocínio foi o seguinte: o Explorer é capaz de detectar arquivos com números consecutivos, mesmo que sejam alinhados à esquerda sem preenchimento, como no meu primeiro exemplo acima. Ele usa essa detecção para classificar os arquivos corretamente.
(por exemplo, link )
Eu estou procurando uma ferramenta que faz a mesma detecção, mas também renomeia os arquivos de acordo. (Encontrando o maior número para cada conjunto relacionado de arquivos, não o maior número em todo o diretório, e depois preenchendo os números em cada conjunto.)

Ou para colocar de outra forma: Eu quero fazer uma "ordenação natural" para todos os arquivos em um diretório, então renomeie-os para que a classificação ascii seja idêntica à "natural sort"

Agora suspeito que não há nenhuma ferramenta capaz de fazer isso, então provavelmente só preciso escrever um script.

    
por HugoRune 14.07.2011 / 00:19

1 resposta

0

Isso deve funcionar em seu nível básico. Faça um backup primeiro!

cd para dir contendo arquivos: 99999 - description.txt

perl rename-pad.pl

#!/usr/bin/perl
opendir(DIR, ".");
@files = sort(grep(/txt$/i, readdir(DIR)));
closedir(DIR);

$len=0;
foreach $file (@files) {
    print $file."\n";
    if ($file=~/xx (\d+)(.*\.txt)$/i) {
        $len=(length($1)>$len)?length($1):$len;
    }
}
foreach $file (@files) {
    if ($file=~/xx (\d+)(.*\.txt)$/i) {
        $newfile=sprintf("%0${len}d%s", $1, $2);
        rename("$file", "$newfile");
    }
}
    
por 25.07.2011 / 05:30