it-swarm-pt.tech

Renomeando arquivos em lote

Eu tenho um diretório cheio de imagens:

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

E eu gostaria que uma linha de nome os renomeias para (digamos).

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

Como eu faço isso?

157
Internet man

Se você estiver usando o Bash ou outro shell compatível com POSIX:

for f in *.png; do
    mv -- "$f" "${f#image}"
done
110
W_Whalley

No Debian e derivativos, o rename do Perl funciona de forma semelhante a sed assim:

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

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

  rename image '' *.png
113
Internet man

zmv

O zsh Shell possui um poderoso comando de renomeação de lote chamado zmv.

Primeiro, você precisa habilitar o comando zmv da seguinte maneira (isso pode entrar no seu ~/.zshrc).

autoload zmv

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

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

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

zmv -w 'image*.png' '$1.png'
42

Normalmente, uso o utilitário Nice e simples mmv ( página do manual ) para este caso de uso:

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

executará sua tarefa.

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

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

34
Marcel Stimberg

POSIX sh para loop

sa sed para renomear

for i in image*jpg
do 
  mv -v "$i" "$(echo "$i" | sed -e 's/^\.\/image//' - )"
done
10
X Tian

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 $_)'
6
gvkv

qmv

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

Nomes de arquivos 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 nomes na coluna da direita:
(Removendo o prefixo image de todas as linhas usando o modo de bloco visual)

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

Log de renomeação:

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

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

6
Volker Siegel

recursivo

recursão fácil selecionando arquivos de imagem * png e não assume a 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
3
X Tian

Usando expansão de chave Shell :

for N in {0001..1000}; do mv "{image,}$N.png"; done
2
αғsнιη

Tente brename ( https://github.com/shenwei356/brename ), uma ferramenta prática de linha de comando de plataforma cruzada para renomear arquivos/diretórios em lote com segurança por meio de expressão regular (compatível com Windows, Linux e OS X ).

@ patrickDurusa disse:

O Linux tem uma variedade de opções de renomeação de arquivos em lote, mas não vi nenhuma falha no nome que me ocorreu.

Recursos:

  • Plataforma cruzada . Suporte para Windows, Mac OS X e Linux.
  • Seguro . Por verificando possíveis conflitos e erros.
  • Filtragem de arquivos . Suporte para inclusão e exclusão de arquivos por meio de expressão regular. Não há necessidade de executar comandos como find ./ -name "*.html" -exec CMD.
  • Renomeando a sub-correspondência com o valor correspondente por meio do arquivo de valores-chave .
  • Renomeando via número crescente ascendente .
  • Renomeando recursivamente arquivos e diretórios .
  • Suporte a funcionamento 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
1
Wei Shen

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
1
X Tian

Para Windows e linux , este script Perl serve; nesse caso:

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

O script pode ser executado recursivamente nos diretórios e até mesmo anexar uma contagem a todos eles:

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

Os caracteres UTF-8 também são tratados corretamente, no Windows e no linux.

1
circulosmeos

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

Para o seu caso, o comando seria:

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

Você pode encontrar mais exemplos/documentos aqui .

0
Jahid