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

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

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

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

ETC。

有一次我决定首选的命名格式为:2014-06-07,新文件夹将使用该格式创建。因此现在文件夹包含旧格式和新格式的目录。

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

我尝试过这个: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

答案1

你的正则表达式坏了,我认为你的意思是这样的:

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

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

请注意,通过此替换,您还将使用新的命名方案重命名文件。您可能希望固定正则表达式。类似这样的操作应该有效:

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

答案2

我会走以下路线:

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”替换为“mv $i $NEWNAME”即可。

当然,这不是一个没有错误的解决方案,例如,如果有一个名为 30-05-14 和 2014-05-30 的目录,这不会重命名当前目录,而是将其移动到 2014-05-30/。由于您说过您曾经切换过方案,我想这不会发生(例如,您没有两种格式的特定日期的目录)。

此外,如果您的目录名称中的某处有空格,此解决方案可能不起作用。

相关内容