
Мне нужно взять следующую структуру имени файла и переименовать в соответствующий день недели:
GMT20161003-randomtext.mp4
в конечном итоге будет какmonday.mp4
У меня много таких файлов в разных подкаталогах, поэтому было бы лучше, если бы их можно было запускать рекурсивно...
решение1
С zsh
:
zmodload zsh/datetime
autoload zmv
zmv -n '(**/)GMT(<->)*(.mp4)(#qD.)' '$1${(L)$(
strftime %A "$(strftime -r %Y%m%d $2)")}$3'
Удалите , -n
чтобы фактически выполнить переименование.
<->
соответствует любому десятичному числу.- Эта секунда
(...)
зафиксирована в$2
,(.mp4)
в$3
и каталоге ((**/)
, рекурсивный) в$1
. (#qD.)
является глобальным квалификатором, который выбирает толькообычныйфайлы (.
не каталоги, не символические ссылки, не fifos/devices...), а также просматривать скрытые каталоги (D
например, dotfile/dotdir).${(L)...}
: преобразует расширение в нижний регистр.strftime -r %Y%m%d
: reverse-strftime (strptime) для преобразования даты во время эпохи.strftime %A ...
: формат времени для этого времени эпохи, где %A — полный день недели. Будьте осторожны, это зависит от локали. (во французской локали вы получите французский день недели).
В системе GNU и с помощью оболочки GNU ( bash
) вы можете сделать следующее:
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 {} +
(удалить echo
для выполнения операции).
${var,,}
будучи bash
оператором для преобразования в нижний регистр. date -d
будучи способом GNU date
для анализа даты (как strftime -r
выше).
Хотя zmv
он и проверяет наличие конфликтов перед началом переименования любого файла, этот не будет. Поэтому мы добавляем -i
выше, чтобы хотя бы дать вам шанс избежать затирания файлов. У GNU mv
есть -v
возможность указать ему, что он собирается сделать, что может быть полезно для отмены команды позже, если что-то пошло не так.