我可以使用哪些命令重命名当前名为
的几百个文件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
,以便它与我上面提出的格式相匹配。
答案 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来转换文件名。上面的命令说:
使用^
查找以file.
开头的文件(.
必须转义,否则匹配任何字符),然后是捕获的()
组{ {1}}(一个数字,4次),然后是[0-9]{4}
,然后是另一个被捕获的数字组两次等,并以-
结束$
;
然后,将这些文件重命名为.txt
,然后是第一个捕获的组file_y
,然后是$1
,然后是第二个捕获的组m
,等等。以$2
结尾。
您还应该能够找出如何使用相同的命令来解决您的第二个问题,以及您对.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