将文件/目录从一种日期格式重命名为另一种日期格式

时间:2017-05-28 23:21:58

标签: date awk terminal grep rename

所以我是一个编码新手,并且有一段时间,想要编辑我相当广泛的现场音乐库的格式。我在这里和其他各种资源一起环顾四周,但是我遇到了麻烦。我有以下列方式命名的目录:

  • 02.10.90 | 23 East Caberet - Ardmore,PA
  • 02.16.90 |天堂 - 马萨诸塞州波士顿

我想将这些简单地重命名为

  • 1990-02-10 | 23 East Caberet - Ardmore,PA
  • 1990-02-16 |天堂 - 马萨诸塞州波士顿

我可以使用以下方法正确重命名日期:

ls -1 | grep 90 |  awk '{print $1}' | awk  -F. '{printf "%s-%s-%s\n", "19"$3,$1,$2}' > list1.txt

然后使用

拉出名称的其余部分
ls -1 | grep 90 | awk '{first = $1; $1 = ""; print $0}'>list2.txt

所以,我有一个目录列表,从1990年到2004年,我想将它应用到(它们都在不同的子目录中,所以我不介意手动更改" grep 90& #34;。然而,从我生成的两个单独的列表中,我无法弄清楚如何使其遍历每一行并打印" mv original_name list1.txt + list2.txt"以便它将读取:

mv 02.10.90 | 23 East Caberet - Ardmore, PA 1990-02-10 | 23 East Caberet - Ardmore, PA

我浏览过很多以前的帖子,无法弄清楚最后一点 - 或者更好,更优雅的解决方案!非常感谢任何帮助,谢谢你提前!

1 个答案:

答案 0 :(得分:0)

不要解析ls的输出,google为什么,当你使用awk时你不需要grep,也不需要awk命令链但是为此任务,你不会使用任何这些命令。

查找文件的UNIX命令名为find,所以从这开始。这将找到名称以给定的globbing模式开头的所有目录:

find . -type d -name '[0-9][0-9].[0-9][0-9].90 *'

现在您已找到需要对其执行操作的文件。为了您的需求恕我直言,最简单的方法是最好的,那就是:

find . -type d -name '[0-9][0-9].[0-9][0-9].90 *' -print0 |
while IFS= read -r -d '' old; do
    path="$(dirname "$old")"
    oldDirName="$(basename "$old")"
    if [[ oldDirName =~ ([0-9]+)\.([0-9]+)\.([0-9]+)( .*) ]]; then
        newDirName="19${BASH_REMATCH[3]}-${BASH_REMATCH[1]}-${BASH_REMATCH[2]}${BASH_REMATCH[4]}
        echo mv -- "${path}/${oldDirName}" "${path}/${newDirName}"
    fi
done

以上是使用GNU find for -print0和bash for BASH_REMATCH。如有必要,请在调试后删除echo,并对其将要执行的操作感到满意。