Se você estiver usando bash
:
for f in *.png; do mv "$f" "${f#image}"; done
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?
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
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'
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.
Usa sed para renomear
for i in image*jpg
do
mv -v "$i" "$(echo "$i" | sed -e 's/^\.\/image//' - )"
done
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 $_)'
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.
$ 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
)
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
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
Usando expansão da cinta de shell :
for N in {0001..1000}; do mv "{image,}$N.png"; done
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.
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 .
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:
find ./ -name "*.html" -exec CMD
. 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
ls * png | enquanto ler -r f; do f2="'echo $ f | sed -e's / imagem //' '"; mv $ f $ f2; feito