Converta ano-mês-dia a dia da semana no nome do arquivo

3

Eu preciso usar a seguinte estrutura de nome de arquivo e renomear para o dia da semana apropriado:

GMT20161003-randomtext.mp4

terminaria em monday.mp4

Eu tenho muitos desses arquivos em vários subdiretórios, então seria melhor se ele pudesse ser executado recursivamente ...

    
por user1399145 04.10.2016 / 14:41

1 resposta

2

com zsh :

zmodload zsh/datetime
autoload zmv
zmv -n '(**/)GMT(<->)*(.mp4)(#qD.)' '$1${(L)$(
  strftime %A "$(strftime -r %Y%m%d $2)")}$3'

Remova o -n para realmente renomear.

  • <-> corresponde a qualquer número decimal.
  • Esse segundo (...) é capturado em $2 , (.mp4) em $3 e o diretório ( (**/) , recursivo) em $1 .
  • (#qD.) é um qualificador glob que seleciona apenas arquivos regulares ( . : não diretórios, nem links simbólicos nem fifos / devices ...) e também percorre diretórios ocultos ( D para dotfile / dotdir ).
  • ${(L)...} : converte a expansão para minúscula.
  • strftime -r %Y%m%d : reverse-strftime (strptime) para converter a data em um horário de época.
  • strftime %A ... : tempo de formatação para esse período de época com% A sendo o dia inteiro da semana. Cuidado, é localidade-dependente. (em um local francês, você terá o dia da semana em francês).

Em um sistema GNU, e com o shell GNU ( bash ), você poderia fazer:

find . -name 'GMT*-*.mp4' -type f -exec bash -c '
  for file do
    base=${file##*/}
    date=${base#GMT}
    date=${date%%-*}
    wday=$(date -d "$date" +%A)
    echo mv -i "$file" "${file%/*}/${wday,,}.mp4"
  done' bash {} +

(remova echo para realizar a operação).

${var,,} sendo o operador bash a converter para minúsculas. date -d é a maneira do GNU date de analisar uma data (como strftime -r acima).

Enquanto zmv verificaria conflitos antes de começar a renomear qualquer arquivo, este não seria. Por isso, adicionamos -i acima para, pelo menos, dar-lhe uma chance de evitar a destruição de arquivos. O GNU mv tem uma opção -v para dizer a ele para mostrar o que vai fazer, o que pode ser útil para reverter o comando mais tarde se algo der errado.

    
por 04.10.2016 / 15:14