
Preciso pegar a seguinte estrutura de nome de arquivo e renomear para o dia da semana apropriado:
GMT20161003-randomtext.mp4
acabaria comomonday.mp4
Eu tenho muitos desses arquivos em vários subdiretórios, então seria melhor se pudessem ser executados recursivamente...
Responder1
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 global que seleciona apenasregulararquivos (.
: 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úsculas.strftime -r %Y%m%d
: Reverse-strftime (strptime) para converter a data em uma época.strftime %A ...
: formate a hora para aquela época, com %A sendo para o dia da semana completo. Cuidado, depende da localidade. (em uma localidade francesa, você receberá 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 bash
o operador para converter para minúsculas. date -d
sendo a date
maneira GNU de analisar uma data (como strftime -r
acima).
Embora zmv
fosse verificar se há conflitos antes de começar a renomear qualquer arquivo, este não o faria. Portanto, adicionamos um -i
item acima para, pelo menos, dar a você a chance de evitar a destruição de arquivos. O GNU mv
tem a -v
opção de mostrar o que fará, o que pode ser útil para reverter o comando mais tarde, se algo der errado.