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

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

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的大量文件夹?

有点令我惊讶的是,看起来我们的老朋友的prename (在某些系统上也称为rename )可以做到这一点 – 有点争吵:

 $ 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 

或者,使用GNU date

 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 

请注意,解析日期可能与语言环境有关。

GNU date命令非常适合在不同日期格式之间进行转换。 例如:

 $ 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 

这是一个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_dir使其成为可执行文件,其中parent_dir是包含要更改其名称的所有目录的父目录。

这是一个执行相同操作的Ruby脚本。 将其放入所有这些目录所在的目录中。

 #!/usr/bin/env ruby require 'time' Dir.glob('*').select do |f| if File.directory? f time = Time.parse(f.to_s) File.rename(f, time.strftime("%Y-%m-%d")) end end 

使用chmod +x rename.rb./rename.rb重命名目录

如果你想要一个好的GUI解决方案,尝试pyrenamer容易和非常可配置