move parte do meio do nome do arquivo para frente

3

Eu tenho arquivos nomeados no estilo 02.04.11 DJ Kilbot.mp3 (por várias datas) e quero reformatar o nome dessa forma: DJ Kilbot 2011-02-04.mp3 . Em outras palavras, o formato atual é MM.DD.YY DJ-NAME.mp3 e quero alterá-lo para DJ-NAME YYYY-MM-DD.mp3 . Qual é a maneira mais fácil de fazer isso, por vários anos de arquivos?

    
por user394 11.01.2016 / 02:34

4 respostas

5

cd para o diretório e execute o seguinte (usando perl-rename ). Esta é uma "corrida a seco" primeiro.

rename -n 's/^([0-9]{2})\.([0-9]{2})\.([0-9]{2}) (.*)\.mp3$/$4 20$3-$1-$2.mp3/' *
02.04.11 DJ Kilbot.mp3 -> DJ Kilbot 2011-02-04.mp3

Se você está feliz com a saída, então execute-a de verdade.

rename 's/^([0-9]{2})\.([0-9]{2})\.([0-9]{2}) (.*)\.mp3$/$4 20$3-$1-$2.mp3/' *

Explicação

  • rename -n : execute um teste "dry-run".
  • 's/FOO/BAR/' substitui o regex FOO e substitui por BAR .
  • ^([0-9]{2})\.([0-9]{2})\.([0-9]{2}) (.*)\.mp3$ : regex para capturar. Combine o início da string ^ , depois três lotes de [0-9]{2} (ou seja, dois números consecutivos) separados por um ponto ( \. quando escapou). Em seguida, um espaço e (.*)\.mp3$ . Parens () captura o conteúdo para uso na substituição.
  • $4 20$3-$1-$2.mp3 : substitua com o nome do DJ o quarto grupo de captura ( $4 ), ou (.*) acima, depois o resto da string como especificado (ou seja, o terceiro, primeiro e segundo grupos).
  • * : atua em todos os arquivos no diretório.

Simplifique

Esta regex tem um pouco de verificação de erros incorporada. Se você tem certeza de que todos os arquivos são nomeados de forma consistente, você pode simplificá-la ligeiramente para o seguinte.

rename 's/^(..)\.(..)\.(..) (.*)\.mp3$/$4 20$3-$1-$2.mp3/' *
    
por 11.01.2016 / 02:56
3

Sem rename :

for file in *.mp3
do
  no_extension=${file%.mp3}
  the_date=$(echo "${no_extension}" | cut -d ' ' -f 1)
  year=20${the_date:6}
  month=${the_date:0:2}
  day=${the_date:3:2}
  date_part=${year}-${month}-${day}
  dj_part=$(echo "${no_extension}" | cut -d ' ' -f 2-)
  new_file="${dj_part} ${date_part}.mp3"
  mv "${file}" "${new_file}"
done

Explicação:

  • for file in *.mp3 faz um loop em todos os arquivos no diretório atual que termina com a extensão .mp3
  • ${file%.mp3} retira a extensão .mp3 do final do arquivo usando manipulação de string bash
  • $(echo ${no_extension} | cut -d ' ' -f 2-) extrai a parte da data do nome do arquivo usando o utilitário cut , que pode analisar cadeias delimitadas por caracteres
  • então alteramos o formato da data extraindo os substrings
  • "${dj_part} ${date_part}.mp3" é apenas concatenação de string das partes que criamos
  • mv "${file}" "${new_file}" renomeia o arquivo
por 11.01.2016 / 03:31
0

Suponha que os arquivos sejam nomeados estritamente dessa maneira.

for file in "*.mp3";do 
  date="${file:0:8}" #get the date in the filename. 
  dj="${file%.mp3}" #strip the extension off the filename. 
  dj="${dj:8}" # get dj name.
  mv -nv $file "$dj $date.mp3" # -n don't overwrite files. 
done
    
por 11.01.2016 / 02:52
0

pyRenamer tem uma GUI e permite a visualização automática.
Coloque isso no campo Padrão de nome de arquivo original:

{#}.{#}.{#} {X}.mp3

E isso no nome do arquivo renomeado patter:

{4} {3}-{1}-{2}.mp3

A única desvantagem é que ele classifica no modo "Windows" (1, 10, 11, 2, 3, 4 ...).

    
por 08.04.2018 / 19:54

Tags