フォルダ名を「dd.mm.yy」から「yy.mm.dd」に変更する正規表現?

フォルダ名を「dd.mm.yy」から「yy.mm.dd」に変更する正規表現?

すべてのフォルダの名前を「dd.mm.yy」から「yy.mm.dd」に変更したいと思います。シェルでこれを行うには?

答え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

これは1行より長いですが、日付については何も仮定しません。

$ 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

関連情報