Преобразовать год-месяц-день в день недели в имени файла

Преобразовать год-месяц-день в день недели в имени файла

Мне нужно взять следующую структуру имени файла и переименовать в соответствующий день недели:

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возможность указать ему, что он собирается сделать, что может быть полезно для отмены команды позже, если что-то пошло не так.

Связанный контент