正则表达式将文件夹从“dd.mm.yy”重命名为“yy.mm.dd”?

正则表达式将文件夹从“dd.mm.yy”重命名为“yy.mm.dd”?

我想将所有文件夹从“dd.mm.yy”重命名为“yy.mm.dd”。如何在 shell 中做到这一点?

答案1

bash重命名当前目录中的目录的解决方案:

for f in [0-3][0-9].[01][0-9].[0-9][0-9]; do
  [ -d "$f" ] && mv -v "$f" "${f:6}.${f:3:2}.${f:0:2}"
done

答案2

您的问题可能需要更多信息,因此我假设:

  • 所有文件夹是指当前目录中的所有文件夹
  • rename当你提到正则表达式时,你忽略了操作系统,所以我正在你的版本支持它们的基础上工作
rename 's/^([0-9]{2})\.([0-9]{2})\.([0-9]{2})\//$3.$2.$1/' */

如果您没有rename,或者您有,但它不支持正则表达式,这是一种更便携的方法(尽管不太优雅):

find . -mindepth 1 -maxdepth 1 -type d \
  | sed 's ^./  ' \
  | grep -E "^([0-9]{2}\.){2}[0-9]{2}$" \
  | while IFS=. read dd mm yy ; do mv $dd.$mm.$yy $yy.$mm.$dd ; done

答案3

这比一行字长,但它没有对日期做出任何假设:

$ mkdir 12.12.12 01.02.99

$ perl -MTime::Piece -Mautodie -E '
  opendir my $dh, ".";
  while (my $f = readdir $dh) {
    if (-d $f and $f =~ /^\d\d.\d\d.\d\d$/) {
      my $t = Time::Piece->strptime($f, "%d.%m.%y");
      rename $f, $t->ymd;
    }
  }
'

$ ls
1999-02-01/  2012-12-12/

答案4

这是一种非常简单的方法,因为已经创建了文件夹。

ls -1d */|cut -f1 -d/ |awk -F"." '{print "mv " $0 " " $3"."$2"."$1"/"}' | bash

相关内容