如何按日期批量重命名文件?
Posted
技术标签:
【中文标题】如何按日期批量重命名文件?【英文标题】:How to batch-rename files by date? 【发布时间】:2013-08-02 20:38:03 【问题描述】:我可以使用哪些命令来重命名当前已命名的数百个文件
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
,使其符合我上面建议的格式。
【问题讨论】:
【参考方案1】:您可以使用rename
命令:
rename 's/^file\.([0-9]4)-([0-9]2)-([0-9]2)\.txt$/file_y$1m$2d$3.txt/' *
这使用Perl regular expression substitution 来转换文件名。上面的命令说:
查找以^
开头和file.
的文件(.
必须转义,否则匹配任何字符),然后是捕获的()
组[0-9]4
(一个数字,4 次),然后是-
,然后是另一个捕获的数字组两次,依此类推,以.txt
结束$
;
然后,将这些文件重命名为file_y
,然后是第一个捕获的组$1
,然后是m
,然后是第二个捕获的组$2
,以此类推,并以.txt
结尾.
您还应该能够弄清楚如何使用相同的命令来解决您的第二个问题,而您不知道 rename
的工作原理。
【讨论】:
【参考方案2】:你也可以使用 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
【讨论】:
以上是关于如何按日期批量重命名文件?的主要内容,如果未能解决你的问题,请参考以下文章