![将文件名中的年月日转换为工作日](https://linux22.com/image/95771/%E5%B0%86%E6%96%87%E4%BB%B6%E5%90%8D%E4%B8%AD%E7%9A%84%E5%B9%B4%E6%9C%88%E6%97%A5%E8%BD%AC%E6%8D%A2%E4%B8%BA%E5%B7%A5%E4%BD%9C%E6%97%A5.png)
我需要采用以下文件名结构并将其重命名为一周中适当的一天:
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 -d
GNU方式(如上)。date
strftime -r
虽然zmv
在开始重命名任何文件之前会检查冲突,但这个不会。因此,我们添加-i
上述内容至少可以让您有机会避免破坏文件。 GNUmv
有一个-v
选项可以告诉它显示它将要执行的操作,如果出现任何问题,这对于稍后恢复命令可能很有用。