首页 > 解决方案 > 如何使用 bash 字符串格式化来反转日期格式?

问题描述

我有很多文件被命名为:MM-DD-YYYY.pdf. 我想重命名它们,因为YYYY-MM-DD.pdf 我确信有一些 bash 魔法可以做到这一点。它是什么?

标签: bashdate-manipulation

解决方案


对于当前目录中的文件:

for name in ./??-??-????.pdf; do
    if [[ "$name" =~ (.*)/([0-9]{2})-([0-9]{2})-([0-9]{4})\.pdf ]]; then
        echo mv "$name" "${BASH_REMATCH[1]}/${BASH_REMATCH[4]}-${BASH_REMATCH[3]}-${BASH_REMATCH[2]}.pdf"
    fi
done

递归地,在当前目录中或下:

find . -type f -name '??-??-????.pdf' -exec bash -c '
    for name do
        if [[ "$name" =~ (.*)/([0-9]{2})-([0-9]{2})-([0-9]{4})\.pdf ]]; then
            echo mv "$name" "${BASH_REMATCH[1]}/${BASH_REMATCH[4]}-${BASH_REMATCH[3]}-${BASH_REMATCH[2]}.pdf"
        fi
    done' bash {} +

启用globstarshell 选项bash可以让我们执行以下操作(也将像上面的解决方案一样,处理当前目录中或之下的所有文件):

shopt -s globstar

for name in **/??-??-????.pdf; do
    if [[ "$name" =~ (.*)/([0-9]{2})-([0-9]{2})-([0-9]{4})\.pdf ]]; then
        echo mv "$name" "${BASH_REMATCH[1]}/${BASH_REMATCH[4]}-${BASH_REMATCH[3]}-${BASH_REMATCH[2]}.pdf"
    fi
done

所有这三个解决方案都使用正则表达式来挑选文件名的相关部分,然后将这些部分重新排列为新名称。它们之间的唯一区别是如何生成路径名列表。

代码前缀mvecho安全起见。要实际重命名文件,请删除echo(但至少运行一次 echo查看它是否符合您的要求)。


推荐阅读