将子目录重命名为不同的日期格式



在 Ubuntu Linux 中:

我有一个包含许多子目录的目录。每个子目录都有子目录,其名称采用日期格式: M_D_YYYY

问题是,当按字母顺序排序时,它们不会按时间顺序列出。

例如,7_25_2019 在 7_3_2019 之前甚至 7_3_2018 之前列出。

我想将子目录重命名为YYYY_MM_DD格式,以便字母顺序与时间顺序匹配。因此,在前面的示例中,它将重命名为:

2018年07月03日

2019年07月03日

2019年07月25日

如何在 shell 命令或脚本中最好地完成此操作?

笔记:

(1)我只想重命名子目录,而不是其中的文件。

(2) 在通过FTP发布文件时,我无法控制文件结构。但是,一夜之间休息了。理想的情况是在第一次运行"修复现有"之后,我可以每晚(午夜之后)运行一个命令/脚本(相同或不同),该命令/脚本将保留以正确格式命名的子目录,并且仅修改子目录(从前一天开始)格式不正确。

(3) 重要的是,不要重命名不是日期格式的第一级子目录。

您可以通过如下find调用找到符合条件(且尚未重命名)的所有目录:

find -E . -type d -regex '.*/[1-9][0-9]?_[1-9][0-9]?_[12][0-9][0-9][0-9]'

找到需要重命名的目录后,下一个问题是,如何重命名它们?

这非常棘手,以至于将功能封装在辅助脚本中很有用,我将称之为renamedir。 一旦我们有了该脚本,我们就可以使用find-exec运算符在每个目录上调用它:

find -E . -type d -regex '.*/[1-9][0-9]?_[1-9][0-9]?_[12][0-9][0-9][0-9]' -exec renamedir {} ;

那么renamedir脚本里面有什么呢? 我第一次剪裁不是很优雅,但它很有效。 我认为,确保月份和日期数字填充到两位数的最佳方法是使用printf。 但这意味着我们需要将各个月、日和年的数字分解为单独的 shell 变量。 而且我不知道有什么好,干净,便携的方法可以做到这一点,所以这里的东西是蛮力。 无论如何,这是我的脚本:

path=`dirname "$1"`
dir=`basename "$1"`
m=`echo "$dir" | sed 's/^([0-9][0-9]*)_([0-9][0-9]*)_([0-9][0-9]*)$/1/'`
d=`echo "$dir" | sed 's/^([0-9][0-9]*)_([0-9][0-9]*)_([0-9][0-9]*)$/2/'`
y=`echo "$dir" | sed 's/^([0-9][0-9]*)_([0-9][0-9]*)_([0-9][0-9]*)$/3/'`
if test $m -lt 1 -o $m -gt 12; then exit; fi
if test $d -lt 1 -o $d -gt 31; then exit; fi
if test $y -lt 1900 -o $y -gt 2100; then exit; fi
newdir=`printf "%d_%02d_%02d" $y $m $d`
mv "$path"/"$dir" "$path"/"$newdir"

(显然这是一个 sh 脚本。 也许更好的方法是使用Perl或Python。

当我运行它时,我确实收到错误消息,例如

find: ./tmp/7_25_2019: No such file or directory

这是因为我们正在从find下重命名目录,在找到它们之后但在它有机会下降到它们之前。 我想你可以忽略这些消息。 (如果你的m_d_yyyy目录曾经m_d_yyyy子目录,这意味着你会错过它们,但它们会在下一次运行时找到,所以也许没关系。

最新更新