【问题标题】:How to batch-rename files by date?如何按日期批量重命名文件?
【发布时间】:2023-04-03 18:04:01
【问题描述】:

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

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,使其符合我上面建议的格式。

【问题讨论】:

    标签: linux bash unix rename batch-processing


    【解决方案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 来转换文件名。上面的命令说:

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

    2. 然后,将这些文件重命名为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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-29
        • 2023-03-04
        • 2010-10-17
        • 1970-01-01
        • 2014-04-22
        • 1970-01-01
        • 2017-01-01
        • 2013-12-19
        相关资源
        最近更新 更多