Bulk renomear arquivos

21

Eu tenho vários arquivos:

10.3.100.179_01_20161018_230014_5335.jpg
10.3.100.179_01_20161018_231514_0814.jpg
10.3.100.179_01_20161018_233014_5706.jpg
10.3.100.179_01_20161018_234514_0896.jpg
10.3.100.179_01_20161018_230114_5395.jpg
10.3.100.179_01_20161018_231614_1145.jpg
10.3.100.179_01_20161018_233114_6047.jpg
10.3.100.179_01_20161018_234614_0547.jpg
10.3.100.179_01_20161018_230114_5492.jpg
10.3.100.179_01_20161018_231614_1264.jpg
10.3.100.179_01_20161018_233114_6146.jpg
10.3.100.179_01_20161018_234614_0658.jpg
10.3.100.179_01_20161018_230214_5630.jpg
10.3.100.179_01_20161018_231714_7135.jpg

Eu quero renomear com este formato:

10.4.100.135_01_20161013131108389_TIMING.jpg
10.4.100.135_01_20161013131111390_TIMING.jpg
10.4.100.135_01_20161013131114401_TIMING.jpg
10.4.100.135_01_20161013131117431_TIMING.jpg
10.4.100.135_01_20161013131120418_TIMING.jpg
10.4.100.135_01_20161013131123461_TIMING.jpg
10.4.100.135_01_20161013131126511_TIMING.jpg

Ele precisa remover o _ no registro de data e hora e adicionar o _TIMING .

    
por Jojo Mendoza 21.10.2016 / 08:33

8 respostas

31

Instale renameutils e use qmv com seu editor de texto favorito.

qmv carrega todos os nomes em seu editor e, quando você os salva e fecha, aplica as alterações aos arquivos reais. Se as alterações forem inconsistentes (por exemplo, dois arquivos recebem o mesmo nome), ela será interrompida sem tocar em nada. Também lida corretamente com renomeações circulares.

Eu costumo fazer:

$ qmv -f do

para que mostre apenas uma coluna de nomes (do: somente destino). Veja como fica:

Sevocêcombiná-locomosvárioscursoresdoSublimeText,AtomouVisualStudioCode,eleéumaferramentamuitoboaepoderosapararenomearemmassa.Porexemplo,paraoAtom,vocêfariaEDITOR="atom -w" qmv -f do .

    
por ateijelo 21.10.2016 / 20:36
25

Use rename ...

rename -n 's/^([0-9]+\.[0-9]\.[0-9]+\.[0-9]+_[0-9]+_)([0-9]+)_([0-9]+)_([0-9]+)\.jpg/$1$2$3$4_TIMING\.jpg/' *

Com -n , isso gerará o que será feito sem fazer nenhuma alteração:

rename(10.3.100.179_01_20161018_230014_5335.jpg, 10.3.100.179_01_201610182300145335_TIMING.jpg)
rename(10.3.100.179_01_20161018_231514_0814.jpg, 10.3.100.179_01_201610182315140814_TIMING.jpg)
rename(10.3.100.179_01_20161018_233014_5706.jpg, 10.3.100.179_01_201610182330145706_TIMING.jpg)
rename(10.3.100.179_01_20161018_234514_0896.jpg, 10.3.100.179_01_201610182345140896_TIMING.jpg)

Se parecer correto, remova o -n

$ rename 's/^([0-9]+\.[0-9]\.[0-9]+\.[0-9]+_[0-9]+_)([0-9]+)_([0-9]+)_([0-9]+)\.jpg/$1$2$3$4_TIMING\.jpg/' *
$ ls
10.3.100.179_01_201610182300145335_TIMING.jpg  10.3.100.179_01_201610182330145706_TIMING.jpg
10.3.100.179_01_201610182315140814_TIMING.jpg  10.3.100.179_01_201610182345140896_TIMING.jpg

Explicando ...

  • s/something/something_else/ pesquisar e substituir
  • ^ o começo do nome (ancoragem)
  • [0-9] qualquer número
  • + um ou mais do caractere anterior
  • \. literal . (sem \ corresponde a qualquer caractere)
  • () para manter esta parte
  • $1$2$3$3 de referências anteriores às coisas correspondidas anteriormente e mantidas com ()

Nota: o * no final do comando está correspondendo a todos os arquivos visíveis no diretório atual. Use um globo mais adequado, se necessário.

    
por Zanna 21.10.2016 / 09:03
11

mmv pode fazer isso da seguinte forma:

mmv '*_*_*_*_*.jpg' '#1_#2_#3#4#5_TIMING.jpg'

10.3.100.179_01_20161018_230014_5335.jpg 10.3.100.179_01_201610182300145335_TIMING.jpg

# 1, # 2, # 3, ... está fazendo referência a cada um deles com o correspondente '*' aqui.

É ainda mais curto com:

mmv '*_*_*.jpg' '#1#2#3_TIMING.jpg'
    
por αғsнιη 21.10.2016 / 09:37
9

Outra abordagem rename :

$ rename -n 's/(.*)_(.*)_(.*)\./$1$2$3_TIMING./' *
10.3.100.179_01_20161018_230014_5335.jpg -> 10.3.100.179_01_201610182300145335_TIMING.jpg
10.3.100.179_01_20161018_230114_5395.jpg -> 10.3.100.179_01_201610182301145395_TIMING.jpg
10.3.100.179_01_20161018_230114_5492.jpg -> 10.3.100.179_01_201610182301145492_TIMING.jpg
10.3.100.179_01_20161018_230214_5630.jpg -> 10.3.100.179_01_201610182302145630_TIMING.jpg
10.3.100.179_01_20161018_231514_0814.jpg -> 10.3.100.179_01_201610182315140814_TIMING.jpg
10.3.100.179_01_20161018_231614_1145.jpg -> 10.3.100.179_01_201610182316141145_TIMING.jpg
10.3.100.179_01_20161018_231614_1264.jpg -> 10.3.100.179_01_201610182316141264_TIMING.jpg
10.3.100.179_01_20161018_231714_7135.jpg -> 10.3.100.179_01_201610182317147135_TIMING.jpg
10.3.100.179_01_20161018_233014_5706.jpg -> 10.3.100.179_01_201610182330145706_TIMING.jpg
10.3.100.179_01_20161018_233114_6047.jpg -> 10.3.100.179_01_201610182331146047_TIMING.jpg
10.3.100.179_01_20161018_233114_6146.jpg -> 10.3.100.179_01_201610182331146146_TIMING.jpg
10.3.100.179_01_20161018_234514_0896.jpg -> 10.3.100.179_01_201610182345140896_TIMING.jpg
10.3.100.179_01_20161018_234614_0547.jpg -> 10.3.100.179_01_201610182346140547_TIMING.jpg
10.3.100.179_01_20161018_234614_0658.jpg -> 10.3.100.179_01_201610182346140658_TIMING.jpg

Se isso parecer funcionar como você deseja, remova o -n .

    
por terdon 21.10.2016 / 11:26
5

Você também pode usar o seguinte. Primeiro faça um backup dos seus arquivos e tente isto:

find . -name "*.jpg" -type f -print0| while read -d $'
user@host$ ls -lart
total 8
drwxrwxr-x 6 user user 4096 Oct 21 10:21 ..
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_230014_5335.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_231514_0814.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_233014_5706.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_234514_0896.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_230114_5395.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_231614_1145.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_233114_6047.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_234614_0547.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_230114_5492.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_231614_1264.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_233114_6146.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_234614_0658.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_230214_5630.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_231714_7135.jpg
drwxrwxr-x 2 user user 4096 Oct 21 10:30 .

user@host$ find . -name "*.jpg" -type f -print0 | while read -d $'
find . -name "*.jpg" -type f -print0| while read -d $'
user@host$ ls -lart
total 8
drwxrwxr-x 6 user user 4096 Oct 21 10:21 ..
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_230014_5335.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_231514_0814.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_233014_5706.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_234514_0896.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_230114_5395.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_231614_1145.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_233114_6047.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_234614_0547.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_230114_5492.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_231614_1264.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_233114_6146.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_234614_0658.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_230214_5630.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_20161018_231714_7135.jpg
drwxrwxr-x 2 user user 4096 Oct 21 10:30 .

user@host$ find . -name "*.jpg" -type f -print0 | while read -d $'%pre%' file
> do
>  newfilename=$(echo "${file%.*}" | sed 's/\(.*\)_\(.*\)_//')
>  mv $file $newfilename"_TIMING.jpg"
> done

10:35:20 t $ ls -lart
total 8
drwxrwxr-x 6 user user 4096 Oct 21 10:21 ..
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182300145335_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182315140814_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182330145706_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182345140896_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182301145395_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182316141145_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182331146047_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182346140547_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182301145492_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182316141264_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182331146146_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182346140658_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182302145630_TIMING.jpg
-rw-rw-r-- 1 user user    0 Oct 21 10:30 10.3.100.179_01_201610182317147135_TIMING.jpg
drwxrwxr-x 2 user user 4096 Oct 21 10:35 .
' file do #extension="${file##*.}" newfilename=$(echo "${file%.*}" | sed 's/\(.*\)_\(.*\)_//') mv "$file" "$newfilename""_TIMING.jpg" done
' file > do > newfilename=$(echo "${file%.*}" | sed 's/\(.*\)_\(.*\)_//') > mv $file $newfilename"_TIMING.jpg" > done 10:35:20 t $ ls -lart total 8 drwxrwxr-x 6 user user 4096 Oct 21 10:21 .. -rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_201610182300145335_TIMING.jpg -rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_201610182315140814_TIMING.jpg -rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_201610182330145706_TIMING.jpg -rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_201610182345140896_TIMING.jpg -rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_201610182301145395_TIMING.jpg -rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_201610182316141145_TIMING.jpg -rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_201610182331146047_TIMING.jpg -rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_201610182346140547_TIMING.jpg -rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_201610182301145492_TIMING.jpg -rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_201610182316141264_TIMING.jpg -rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_201610182331146146_TIMING.jpg -rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_201610182346140658_TIMING.jpg -rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_201610182302145630_TIMING.jpg -rw-rw-r-- 1 user user 0 Oct 21 10:30 10.3.100.179_01_201610182317147135_TIMING.jpg drwxrwxr-x 2 user user 4096 Oct 21 10:35 .
' file do #extension="${file##*.}" newfilename=$(echo "${file%.*}" | sed 's/\(.*\)_\(.*\)_//') mv "$file" "$newfilename""_TIMING.jpg" done

sed 's/\(.*\)_\(.*\)_//') exclui os caracteres _ no registro de data e hora.

Por exemplo:

%pre%     
por Mustafa DOGRU 21.10.2016 / 09:23
2

Você provavelmente terminou, mas aqui está uma (simples) solução bash :
É "simples ... solução bash" um oxímoro?

#!/bin/bash

#loop through all files ending in .jpg
for f in *.jpg;
do

    #cut out everything to the timestamp
    firsthalf=${f%_*_*_*}

    #get from the timestamp on
    lasthalf=${f#*_*_}

    #remove (all) underscores from timestamp
    #note the 2 forward slashes...
    lasthalf=${lasthalf//_/}

    #get our extension
    ext=${lasthalf##*.}

    #now we can remove the extension
    lasthalf=${lasthalf%.*}

    #rename the file
    #change 'mv' to 'echo' if you want to do a trial run first...
    mv "$f" "${firsthalf}_${lasthalf}_TIMING.${ext}"

done;

PS: A lógica no loop foi testada com um dos seus nomes de arquivos de exemplo. Passou.

    
por Jefré N. 21.10.2016 / 23:10
1

Se você pudesse usar GUI, eu recomendaria pyRenamer .

Está presente na maioria das distribuições, f.i. no Ubuntu:

sudo apt-get install pyrenamer

Pode fazer tudo o que quiser e muito mais.

  • Pode usar padrões, adicionar ou suprimir texto.
  • Ele pode acessar os dados EXIF se renomear fotos, para que você possa gerar padrões com base na data / hora, etc ...
  • É possível usar alguns metadados ao renomear arquivos de música.
  • Além disso, tem uma pré-visualização , o que pode impedir alguns erros difíceis de reverter.
por jrierab 21.10.2016 / 17:18
0

Aqui está o seu conteúdo find + xargs + sed + < strong> mv oneliner (oneliners do amor):

find . -name "*.jpg" -print0 | sort -z | xargs -0 sh -c 'for filename; do mv "$filename" $(echo "${filename}" | sed "s/\([0-9]\{8\}\)_\([0-9]\{6\}\)_\([0-9]\{4\}\)/_TIMING/g"); done' sh

Explicação:

  • find . -name "*.jpg" | sort | xargs sh -c <command> sh : liste todos os JPEGs no diretório atual e execute um comando shell para cada um (a ordenação é opcional, é claro, mas mantenha as coisas um pouco mais limpas se você estiver registrando em algum lugar)

  • -print0 , -z , -0 : é um bom hábito separar itens com binário 0 ao tokenizar nomes de arquivos para evitar problemas com espaços em branco no meio (não é o seu caso embora)

  • mv "$filename" $(echo "${filename}" | sed "s/\([0-9]\{8\}\)_\([0-9]\{6\}\)_\([0-9]\{4\}\)/_TIMING/g"); : (as barras invertidas na regex do sed não ajudam a sua legibilidade, mas é simples) renomear cada arquivo substituindo a sequência de sublinhado-separado de 8 + 6 + 4 dígitos com a concatenação contígua mais _TIMING thing ( \i é uma referência anterior ao grupo i -th regex).

Refs: Xargs - man sed

    
por Campa 26.10.2016 / 09:52