
Necesito tomar la siguiente estructura de nombre de archivo y cambiarle el nombre al día apropiado de la semana:
GMT20161003-randomtext.mp4
terminaría comomonday.mp4
Tengo muchos de estos archivos en varios subdirectorios, por lo que sería mejor si pudieran ejecutarse de forma recursiva...
Respuesta1
Con zsh
:
zmodload zsh/datetime
autoload zmv
zmv -n '(**/)GMT(<->)*(.mp4)(#qD.)' '$1${(L)$(
strftime %A "$(strftime -r %Y%m%d $2)")}$3'
Elimine el -n
para realizar el cambio de nombre.
<->
coincide con cualquier número decimal.- Ese segundo
(...)
se captura en$2
,(.mp4)
en$3
y el directorio ((**/)
, recursivo) en$1
. (#qD.)
es un calificador global que solo seleccionaregulararchivos (.
: no directorios, ni enlaces simbólicos ni fifos/dispositivos...) y también atravesar directorios ocultos (D
para dotfile/dotdir).${(L)...}
: convierte la expansión a minúsculas.strftime -r %Y%m%d
: inversa-strftime (strptime) para convertir la fecha a una época de época.strftime %A ...
: formatea la hora para esa época siendo %A el día completo de la semana. Tenga en cuenta que depende de la configuración regional. (en una configuración regional francesa, obtendrá el día de la semana en francés).
En un sistema GNU, y con el shell GNU ( bash
), podrías hacer:
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 {} +
(retirar echo
para realizar la operación).
${var,,}
siendo bash
el operador 'para convertir a minúsculas. date -d
siendo la forma GNU date
de analizar una fecha (como strftime -r
arriba).
Si bien zmv
comprobaría si hay conflictos antes de comenzar a cambiar el nombre de cualquier archivo, este no lo haría. Por lo tanto, agregamos lo -i
anterior para al menos brindarle la oportunidad de evitar archivos dañinos. GNU mv
tiene una -v
opción para decirle que muestre lo que va a hacer, lo que puede ser útil para revertir el comando más adelante si algo salió mal.