如何批量将文件夹名称从一种日期格式转换为另一种日期格式

如何批量将文件夹名称从一种日期格式转换为另一种日期格式

我有大量的文件夹,以日期命名,如下所示:

10 Aug 2010  15 Sep 2010  20 Jun 2010  25 Jul 2010  6 Nov 2010
10 Sep 2010  16 Aug 2010  20 Mar 2010  26 Aug 2010  6 Oct 2010
11 Apr 2010  16 Jun 2010  21 Jun 2010  28 Aug 2010  7 Apr 2010
12 Aug 2010  16 Oct 2010  21 Mar 2010  28 Feb 2010  7 Aug 2010
13 May 2010  17 Apr 2010  22 Feb 2010  28 Jun 2010  7 Jun 2010
14 Aug 2010  17 Aug 2010  23 Jul 2010  28 Mar 2010  8 Apr 2010
14 Jun 2010  18 Aug 2010  24 Jul 2010  29 Mar 2010  8 Aug 2010
15 Aug 2010  19 Aug 2010  24 Nov 2010  30 Aug 2010  8 Jul 2010
15 Jul 2010  4 Apr 2010  25 Apr 2010  6 May 2010   8 Sep 2010

我希望将日期格式改为这样:

2010-04-04  2010-05-03
2010-06-06  2010-07-02
2010-07-05  2010-09-01
2010-09-04  2010-09-05
2010-11-01

如何批量将大量文件夹重命名DD MMM YYYYYYYY-MM-DD

答案1

令我有些惊讶的是,看起来我们的老朋友prenamerename在某些系统上)可以做到这一点 - 只需一点争论:

$ prename -vn -- '
  BEGIN{use Time::Piece};
  s/\d+ \w+ \d+/Time::Piece->strptime($&, "%d %b %Y")->strftime("%Y-%m-%d")/e
' *
10 Aug 2010 renamed as 2010-08-10
8 Sep 2010 renamed as 2010-09-08

或者,使用 GNUdate

dirs=( ?\ ???\ ???? ??\ ???\ ???? ) # matches D MMM YYYY and DD MMM YYYY

for d in "${dirs[@]}"; do mv -v -- "$d" "$(date '+%Y-%m-%d' -d "$d")"; done

使用echo(相当于 prename 的-n标志) 进行测试:

$ for d in "${dirs[@]}"; do echo mv -v -- "$d" "$(date '+%Y-%m-%d' -d "$d")"; done
mv -v -- 8 Sep 2010 2010-09-08
mv -v -- 10 Aug 2010 2010-08-10

请注意,日期的解析可能依赖于语言环境。

答案2

GNUdate命令非常擅长在不同的日期格式之间进行转换。例如:

$ date -d '17 Aug 2010' +%F
2010-08-17

考虑到这一点,如果目标目录中唯一的东西是您想要重命名的子目录,那么您只需执行以下操作:

for d in *; do mv "$d" "$(date -d "$d" +%F)"; done

如果你想指定目录仅有的, 使用:

for dir in */; do d=${dir%%/}; mv "$d" "$(date -d "$d" +%F)"; done

并且仅匹配名称以数字开头的目录:

for dir in [0-9]*/; do d=${dir%%/}; mv "$d" "$(date -d "$d" +%F)"; done

答案3

下面是可以使用模块执行重命名的 Python 脚本datetime

#!/usr/bin/env python

from datetime import datetime
import os
import os.path
import sys


def main(target):
    dir_path = os.path.abspath(target)
    for i in os.listdir(target):
        old_name = os.path.join(dir_path, i)
        d = datetime.strptime(i, '%d %b %Y').strftime('%Y-%m-%d')
        new_name = os.path.join(dir_path, d)
        os.rename(old_name, new_name)

if __name__ == '__main__':
    main(sys.argv[1])

我们将脚本命名为rename.py。要使用该脚本,首先通过运行使其可执行chmod +x rename.py,然后运行包含./rename.py parent_dirparent_dir更改名称的所有目录的父目录。

答案4

如果你想要一个好的 GUI 解决方案,可以尝试 pyrenamer,它简单而且配置性很强

相关内容