![正则表达式将文件夹从“dd.mm.yy”重命名为“yy.mm.dd”?](https://linux22.com/image/162451/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%B0%86%E6%96%87%E4%BB%B6%E5%A4%B9%E4%BB%8E%E2%80%9Cdd.mm.yy%E2%80%9D%E9%87%8D%E5%91%BD%E5%90%8D%E4%B8%BA%E2%80%9Cyy.mm.dd%E2%80%9D%EF%BC%9F.png)
我想将所有文件夹从“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