すべてのフォルダの名前を「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