Eu tenho um diretório que contém arquivos de imagem numerados, algo como isto:
01.png
02.png
03.png
03.svg
04.png
05.png
06.jpg
07.png
08.png
09.png
09.svg
10.png
Às vezes, pode haver várias versões de um arquivo em diferentes formatos (por exemplo, a png
e svg
versão dos arquivos 03
e 09
acima), mas os números são consecutivos. Normalmente, existem 40 a 80 desses arquivos em cada diretório. Os números correspondem à ordem em que essas imagens aparecem em um manuscrito (um documento do Word, mas isso não é importante). Não há outra maneira de determinar a ordem das imagens.
Se eu adicionar uma nova imagem ao manuscrito, preciso colocar uma cópia da imagem nesse diretório com a numeração correta. Portanto, se a nova imagem é a quinta do manuscrito, preciso renomear os arquivos no diretório para isso, a fim de abrir espaço para ela:
01.png
02.png
03.png
03.svg
04.png
06.png
07.jpg
08.png
09.png
10.png
10.svg
11.png
Qual é a maneira mais direta a partir da linha de comando ou de um script ou macro para renumerar todos os arquivos começando em um determinado número? Eu tenho uma instalação padrão do Fedora Linux usando o bash.
Isso seria mais fácil no zsh, onde você pode usar
On
qualificador glob para classificar as correspondências em ordem decrescente (en
usar a ordem numérica, caso os nomes dos arquivos nem todos tenham zeros à esquerda na mesma largura);(l:WIDTH::FILLER:)
sinalizador de expansão de parâmetro para preencher todos os números na mesma largura (a largura do número maior).No bash, eis um script que assume que os arquivos são preenchidos com uma largura fixa (caso contrário, o script não renomeia os arquivos corretos) e se ajusta a uma largura fixa (que deve ser especificada).
fonte
Esse problema exato é abordado neste artigo . Observe que você precisaria modificá-lo para suportar os formatos SVG e PNG, adicionando uma segunda etapa de MV.
fonte
Mais fácil:
Você terá:
fonte
Parece não haver muito interesse recente nessa questão, mas, se alguém a encontrar, há três questões aqui. Uma é como selecionar arquivos para renomear com base em critérios semânticos (o intervalo não é lexical e não pode ser especificado por curingas ou mesmo expressões regulares - a teoria dos autômatos diz que isso é mais complexo que um NFA). A segunda é como alterar um nome, modificando uma parte dele. O terceiro é como evitar a colisão de nomes. Um script no Bash e em muitos outros idiomas pode fazer essa transformação específica, mas a maioria de nós prefere não precisar escrever um programa toda vez que quisermos renomear um monte de arquivos. Com o meu rene.py (de código aberto e gratuito), você pode fazer o que quiser, mas são necessárias duas invocações para evitar o problema de colisão de nomes. Primeiro
rene ?.*/#7-80 %?.* B
incrementa todos os nomes no intervalo, adicionando um prefixo de% para evitar nomes existentes. Em seguida,rene %* *
remove esse prefixo dos arquivos que o possuem. Eu descrevo isso em https://sourceforge.net/p/rene-file-renamer/discussion/examples/thread/f0fe8aa63c/fonte