使用正则expression式在Linux上通过命令行批量重命名目录

我在服务器上有一个文件夹,其中包含每天创build的目录,并按date命名,如下所示:

07-06-14 08-06-14 09-06-14 

等等

在某个时候,我决定首选的命名格式如下:2014-06-07新的文件夹是用这种格式创build的。 所以现在这个文件夹同时包含旧格式和新格式的目录。

如何将旧格式的目录批量重命名为新格式?

我已经试过了: rename -n 's/(\d{2})\-(\d{2})\-(\d{2})\20$3-$2-$1//' *

但它会引发错误: Use of uninitialized value $2 in regexp compilation at (eval 1) line 1

你的正则expression式被打破了,我想你的意思是这样的:

 's/(\d{2})-(\d{2})-(\d{2})/20$3-$2-$1/' 

即连字符不需要转义,第二个斜线不合适。

请注意,使用这种replace,您还将使用新的命名scheme重命名文件。 您可能想要锚定正则expression式。 像这样的东西应该工作:

 rename -n 's/^(\d{2})-(\d{2})-(\d{2})$/20$3-$2-$1/' * 

我会走以下路线:

 for i in `find . -name "[0-9][0-9]-[0-9][0-9]-[0-9][0-9]"`; do NEWNAME=`echo $i | sed 's/\([0-9][0-9]\)-\([0-9][0-9]\)-\([0-9][0-9]\)/20\3-\2-\1/'` echo $NEWNAME done 

现在,当您对输出满意时,只需将“echo $ NEWNAME”replace为“mv $ i $ NEWNAME”即可。

Offcourse,这不是一个无错的解决scheme,例如,如果有一个名为30-05-14和2014-05-30的目录,这将不会重命名当前的目录,但将其移到2014-05-30 /。 既然你说过,你改变scheme在一个点上,我想这不会发生(例如,你没有在这两种格式的某个date目录)。

此外,如果您的目录名称中有空格,此解决scheme可能无法正常工作。