Com renomeação de perl
rename 'y/A-Z/a-z/' *
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
...
Com renomeação de perl
rename 'y/A-Z/a-z/' *
for i in ./DSCN*JPG; do mv "$i" "$(echo "$i" | tr A-Z a-z)" ; done
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
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.
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
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.
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.
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.
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 -d
cmd p1 p2
Um formulário geral mv oldfilename newfilename
example $oldname.New
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 Exemplo $( )
substituição de saída do comando tr "{}" _
comando que é executado %code% com entrada lida da variável $ oldname
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
Tags command-line rename shell