Renomeação em lote de arquivos [duplicados]

4

Eu tenho um diretório cheio de imagens:

DSCN4749.JPG
DSCN4750.JPG
DSCN4892.JPG
...

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

dscn4749.jpg
dscn4750.jpg
dscn4892.jpg
...

Como faço isso?

Alternativas / extenstions / caveats

  • Eu quero recurse
  • O diretório contém uma mistura de tipos de arquivos Eu só quero renomear arquivos DSCN * .JPG.
  • solução bash
  • solução perl
  • solução zsh
  • Eu quero uma nova árvore de diretórios com arquivos existentes de links físicos.
  • Eu quero mudar o nome mais do que apenas uma mudança de caso, por exemplo, dscn5555.JPG para 05555.jpg

...

    
por X Tian 09.02.2014 / 19:34

7 respostas

10

Com renomeação de perl

rename 'y/A-Z/a-z/' *
    
por 09.02.2014 / 20:17
7

POSIX sh para loop

for i in ./DSCN*JPG; do mv "$i" "$(echo "$i" | tr A-Z a-z)" ; done

bash while loop

bom para um número ilimitado de arquivos, lendo uma lista de nomes de um arquivo

Lendo nomes do comando find .

find . -maxdepth 1 -type f -name 'DSCN*JPG' | while IFS= read -r f; do
  mv -v "$f" "$( tr A-Z a-z <<< $f )"
done

Lendo a lista de nomes em um arquivo chamado flist

while IFS= read -r f; do mv -v "$f" "$( tr A-Z a-z <<<$f )"; done < flist
    
por 10.02.2014 / 01:57
5

Algumas distribuições do Linux têm um programa chamado "mmv" (por exemplo, debian ). Isso pode executar uma renomeação baseada na correspondência de padrões de nomes de arquivos. No seu caso, o comando que você quer é:

mmv 'DSCN*.JPG' 'dscn#1.jpg'

Ele interpreta o próprio padrão de nome de arquivo, em vez de confiar na expansão de shell, então lembre-se de citar os curingas. No padrão de destino, #1 refere-se ao primeiro curinga no padrão de origem e assim por diante. Eu sugeriria executar

mmv -n 'DSCN*.JPG' 'dscn#1.jpg'

primeiro, que fornecerá uma lista de operações que serão executadas como uma execução a seco.

Ele também pode manipular renomeação recursiva, usando o padrão especial ; (que corresponde a qualquer número de níveis de subdiretórios, similarmente ao padrão ** usado por algumas outras ferramentas). Então, para executar esta operação recursivamente, o comando é:

mmv ';DSCN*.jpg' '#1dscn#2.jpg'

Ele também pode manipular a transformação de caso dos próprios nomes de arquivos, portanto, se você não tivesse certeza de que todos os seus arquivos começavam com o prefixo DSCN, por exemplo, o seguinte funcionaria:

mmv '*.JPG' '#l1.jpg'

ou até mesmo

mmv '*' '#l1'

ou

mmv ';*' '#1#l2'

para executar a renomeação recursivamente.

Uma nova árvore de diretórios com links físicos para os arquivos originais pode ser produzida usando a opção -l :

mmv -l ';DSCN*.JPG' '../output/#1dscn#2.jpg'

Eu não testei isso, mas acredito que ele criará diretórios conforme necessário.

    
por 09.02.2014 / 22:34
3

recursivo

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

find . -name "DSCN*.JPG" | while read f; do mv -v "$f" "$( tr A-Z a-z <<<$f )"; done

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

find . -name "DSCN*.JPG" | while IFS= read -r f; do 
   mv -v "$f" "$( tr A-Z a-z <<<$f )"; 
done
    
por 09.02.2014 / 21:36
2

zsh

Primeiro carregue o zmv incorporado com:

% autoload -U zmv

Isso pode ser executado a partir da linha de comando ou colocado em .zshrc para estar sempre ativado. Para renomear todos os seus arquivos para minúsculas, basta usar o comando:

% zmv '*.JPG' '${(L)f}'

Isso renomeará todos os arquivos correspondentes a *.JPG para o mesmo nome, mas em minúsculas. Este é um dos casos de uso mais simples de zmv e pode fazer renomeação de lote muito mais poderosa.

    
por 09.02.2014 / 23:19
1

Padrão genérico

Como você pode ver nas respostas, o padrão genérico é

[Produza um conjunto de nomes de arquivos para trabalhar] | [leia cada nome e execute o actionCommand]

actionCommand realiza a ação desejada, por exemplo, mv e geralmente recebe dois parâmetros de nome de arquivo original e novo nome de arquivo.

produzindo o nome do arquivo

find é geralmente usado.

Para manipular nomes de arquivos com caracteres incomuns, o -print0 é usado para finalizar cada seqüência impressa com o caractere nulo. No entanto, o sid de leitura do pipe também precisa cooperar e ler os caracteres até que seja lido null em vez de terminar prematuramente após um espaço.

lendo cada nome de arquivo

Alguns comandos podem usar a opção -0 para manipular o lado da leitura de uma cadeia de caracteres terminada com nulo.

O comando xargs foi projetado para essa finalidade

o bash tem read -dcmd p1 p2

actionCommand

Um formulário geral mv oldfilename newfilename example $oldname.New

produzindo o novo nome de arquivo

O novo nome de arquivo é geralmente derivado do nome do arquivo original.

Pode ser tão simples quanto acrescentar uma string, por exemplo, tr

  • sed é bom para a simples tradução de caracteres
  • $( tr "{}" _ <<< $oldname ) poder editar nomes de arquivos

sub-comando do comando bash

Exemplo $( )

substituição de saída do comando tr "{}" _ comando que é executado %code% com entrada lida da variável $ oldname

    
por 09.02.2014 / 21:29
1

alterar nome com sed

para alterações de nome mais complicadas /

find . -name DSCN\*.JPG | while read f; do 
   mv -v "$f" "$( sed -e 's/\([^0-9]*\)\([0-9]*\.\)\(JPG\)$/jpg/'  <<<$f )"; 
done
    
por 09.02.2014 / 21:36