将文件名中的年月日转换为工作日

将文件名中的年月日转换为工作日

我需要采用以下文件名结构并将其重命名为一周中适当的一天:

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/设备...),还遍历隐藏目录(D对于 dotfile/dotdir)。
  • ${(L)...}:将扩展名转换为小写。
  • strftime -r %Y%m%d:reverse-strftime (strptime) 将日期转换为纪元时间。
  • strftime %A ...:该纪元时间的格式时间,%A 表示整个工作日。请注意,它取决于区域设置。 (在法国语言环境中,您将获得法国工作日)。

在 GNU 系统上,使用 GNU shell ( 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,,}beingbash的运算符转换为小写。是解析日期的date -dGNU方式(如上)。datestrftime -r

虽然zmv在开始重命名任何文件之前会检查冲突,但这个不会。因此,我们添加-i上述内容至少可以让您有机会避免破坏文件。 GNUmv有一个-v选项可以告诉它显示它将要执行的操作,如果出现任何问题,这对于稍后恢复命令可能很有用。

相关内容