2

我可以使用哪些命令来重命名当前命名的几百个文件

file.2003-01-02.txt
file.2003-01-04.txt

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

file_y2003m01d02.txt
file_y2003m01d04.txt

... ETC。

换句话说,file.2007-12-09.txt会变成file_y2007m12d09。是否有一组简单的命令可以做到这一点?

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

4

2 回答 2

3

您可以使用以下rename命令:

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

这使用Perl 正则表达式替换来转换文件名。上面的命令说:

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

  2. 然后,将这些文件重命名为file_y后跟第一个捕获的组$1,然后是m,然后是第二个捕获的组$2,依此类推,并以 . 结尾.txt

您还应该能够弄清楚如何使用相同的命令来解决您的第二个问题,而您不知道它是如何rename工作的。

于 2013-08-01T19:12:04.653 回答
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
于 2013-08-01T19:27:43.057 回答