Batch renomeando arquivos

128

Eu tenho um diretório cheio de imagens:

image0001.png
image0002.png
image0003.png
...

E eu gostaria que um de uma linha mudasse o nome para (digamos).

0001.png
0002.png
0003.png
...

Como faço isso?

    
por Internet man 24.08.2010 / 01:55

14 respostas

89

Se você estiver usando bash :

for f in *.png; do mv "$f" "${f#image}"; done
    
por 24.08.2010 / 02:09
88

No Debian e derivados, o rename do Perl funciona de forma semelhante ao sed assim:

  rename -v 's/image//' *.png

Há também o rename de util-linux que funciona assim:

  rename image '' *.png
    
por 24.08.2010 / 02:12
36

zmv

O shell zsh tem um poderoso comando de renomeação de lote chamado zmv .

Primeiro, você precisa ativar o comando zmv da seguinte maneira (isso pode ser feito em ~/.zshrc ).

autoload zmv

A sintaxe básica é zmv PATTERN REPLACEMENT . O padrão é uma expressão glob glob. Partes do padrão podem ser cercadas por parênteses. O texto de substituição pode conter $1 , $2 , etc. para se referir ao N-ésimo grupo entre parênteses no padrão. Por exemplo:

zmv 'image(*.png)' '$1'

Você também pode solicitar que o zsh defina automaticamente $1 , $2 , etc. para corresponder aos caracteres curinga no padrão:

zmv -w 'image*.png' '$1.png'
    
por 24.08.2010 / 02:15
29

Eu normalmente uso a agradável e simples mmv ( página de manual ) utilitário para este usecase:

$ mmv "image*.png" "#1.png"

executará sua tarefa.

O #1 no padrão de destino será substituído pelo que corresponder ao caractere curinga no padrão de origem. Isso também funciona para vários curingas e pode ser usado, por exemplo, para alterar a ordem de partes de nomes de arquivos. Você também pode facilmente fazer coisas mais complicadas, como converter letras minúsculas em letras maiúsculas.

Certifique-se de proteger os padrões do shell, citando.

    
por 24.08.2010 / 17:37
8

POSIX sh para loop

Usa sed para renomear

for i in image*jpg
do 
  mv -v "$i" "$(echo "$i" | sed -e 's/^\.\/image//' - )"
done
    
por 10.02.2014 / 17:45
5

Eu gosto do Perl, então:

perl -nlE '$old=$_; s/image//; qx(mv $old $_)'

Você também pode usar o mesmo padrão para outras tarefas, como copiar os arquivos para outro diretório:

perl -nlE '$old=$_; s(image)(/path/to/new/dir/); qx(mv $old $_)'
    
por 24.08.2010 / 02:56
4

qmv

O comando qmv de renameutils abre um editor mostrando uma lista de nomes de arquivos com duas colunas, separadas por uma tabulação. Cada linha mostra um dos nomes de arquivo, o mesmo em ambas as colunas. A coluna da direita representa os novos nomes dos arquivos.
Para fazer alterações, edite os nomes no lado direito. Neste exemplo, :%s/... ou modo de bloco visual são úteis.

Nomes de arquivo no seu editor

$ qmv *.png

No editor:

image0001.png           image0001.png
image0002.png           image0002.png
image0003.png           image0003.png         
~                                             
~                                             
~                                             
~                                             
"/tmp/user/1000/qmvxWyVMs" 3L, 93C

Edite os nomes na coluna da direita:
(Removendo o prefixo image de todas as linhas usando o modo de bloqueio visual)

image0001.png           0001.png
image0002.png           0002.png
image0003.png           0003.png         
~                                             
~                                             
~                                             
~                                             
:wq

Registro de renomeação:

image0001.png -> 0001.png
image0002.png -> 0002.png
image0003.png -> 0003.png

(por exemplo, Ubuntu: apt-get install renameutils )

    
por 09.10.2014 / 05:12
3

recursivo

fácil recurse selecionando imagem * png, e não assume necessidade de lidar com nova linha em nomes de arquivos

find . -name "image*.png" | while read f; do mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"; done

Seguro, pode lidar com espaços, novas linhas, barras invertidas e qualquer outra coisa :

find . -name "image*.png" | while IFS= read -r f; do 
   mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"; 
done
    
por 10.02.2014 / 18:53
1

POSIX sh usando um loop while

Lendo nomes do comando find .

find . -maxdepth 1 -type f -name 'image*png' | while IFS= read -r f; do
  mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"
done

Lendo nomes de um arquivo

while IFS= read -r f; do mv -v "$f" "$(echo "$f"|sed -e 's/^\.\/image//' - )"; done < flist
    
por 10.02.2014 / 17:52
1

Usando expansão da cinta de shell :

for N in {0001..1000}; do mv "{image,}$N.png"; done
    
por 01.09.2017 / 11:06
1

Para o Windows e Linux , este script Perl serve; neste caso:

$ rnm -l 's/^image//' '*.png'

O script pode ser executado recursivamente em diretórios e até mesmo incluir uma contagem em todos eles:

$ rnm -r 's/^/$counter./' '/\.png$/'

Os caracteres UTF-8 também são tratados corretamente, tanto no Windows quanto no Linux.

    
por 01.07.2018 / 02:19
0

Você pode usar essa ferramenta: rnm ( página da web )

Para o seu caso, o comando seria:

rnm -rs '/^image//' *.png

Você pode encontrar mais exemplos / docs aqui .

    
por 15.10.2015 / 17:32
0

Tente brename ( link ), uma ferramenta de linha de comando prática em várias plataformas para renomear arquivos / diretórios em lote com segurança por meio da expressão regular (suportando Windows, Linux e OS X).

@patrickDurusau disse:

Linux has a variety of batch file renaming options but I didn’t see any short-comings in brename that jumped out at me.

Recursos:

  • Plataforma cruzada . Suportando Windows, Mac OS X e Linux.
  • Seguro . Ao verificar potenciais conflitos e erros .
  • Filtragem de arquivos . Suportando incluir e excluir arquivos via expressão regular. Não há necessidade de executar comandos como find ./ -name "*.html" -exec CMD .
  • Renomeando a correspondência com o valor correspondente por meio do arquivo de valor-chave .
  • Renomear via número ascendente .
  • Renomeando recursivamente arquivos e diretórios .
  • Suporte a execução a seco .
  • Saída colorida .

Comando:

$ brename -f .png -p image
[INFO] checking: [ ok ] 'image0001.png' -> '0001.png'
[INFO] checking: [ ok ] 'image0002.png' -> '0002.png'
[INFO] checking: [ ok ] 'image0003.png' -> '0003.png'
[INFO] 3 path(s) to be renamed
[INFO] renamed: 'image0001.png' -> '0001.png'
[INFO] renamed: 'image0002.png' -> '0002.png'
[INFO] renamed: 'image0003.png' -> '0003.png'
[INFO] 3 path(s) renamed
    
por 01.09.2017 / 10:25
-5

ls * png | enquanto ler -r f; do f2="'echo $ f | sed -e's / imagem //' '"; mv $ f $ f2; feito

    
por 24.08.2010 / 02:02