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?
Se você estiver usando o Bash ou outro shell compatível com POSIX:
for f in *.png; do
mv -- "$f" "${f#image}"
done
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
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'
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.
sa 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 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.
$ 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
)
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
Usando expansão de chave Shell :
for N in {0001..1000}; do mv "{image,}$N.png"; done
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:
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
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
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.
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 .