如何按日期批量重命名文件?

时间:2013-08-01 18:54:46

标签: linux bash unix rename batch-processing

我可以使用哪些命令重命名当前名为

的几百个文件
file.2003-01-02.txt
file.2003-01-04.txt

......等等?我希望他们被命名为:

file_y2003m01d02.txt
file_y2003m01d04.txt

......等等。

换句话说,file.2007-12-09.txt将成为file_y2007m12d09。是否有一组简单的命令来执行此操作?

同样,我还有另一个问题,即文件名为file_y2003m02d01_grid.txt。我想知道如何从每个文件名中删除_grid,以便它与我上面提出的格式相匹配。

2 个答案:

答案 0 :(得分:3)

您可以使用rename命令:

rename 's/^file\.([0-9]{4})-([0-9]{2})-([0-9]{2})\.txt$/file_y$1m$2d$3.txt/' *

这使用Perl regular expression substitution来转换文件名。上面的命令说:

  1. 使用^查找以file.开头的文件(.必须转义,否则匹配任何字符),然后是捕获的()组{ {1}}(一个数字,4次),然后是[0-9]{4},然后是另一个被捕获的数字组两次等,并以-结束$;

    < / LI>
  2. 然后,将这些文件重命名为.txt,然后是第一个捕获的组file_y,然后是$1,然后是第二个捕获的组m,等等。以$2结尾。

  3. 您还应该能够找出如何使用相同的命令来解决您的第二个问题,以及您对.txt的工作原理的了解。

答案 1 :(得分:0)

您也可以使用sed:

例如:

ls | while read f; do echo "mv $f $(echo $f | sed 's/\./_y/;s/-/m/;s/-/d/')"; done

这将显示bash将运行的命令。要实际执行移动,请删除回显和引号:

ls | while read f; do mv $f $(echo $f | sed 's/\./_y/;s/-/m/;s/-/d/'); done