【问题标题】:Rename all the files in the directory, increasing part of the filename by 1重命名目录中的所有文件,文件名的一部分加1
【发布时间】:2015-12-17 00:02:45
【问题描述】:

我想用特定的命名约定重命名文件

所有文件都命名为[字母][字母][6位数字].txt

所需的重命名模式

aa006793.txt -> aa006893.txt

谁能帮忙?

【问题讨论】:

  • 所有文件的名称都像 [a-z][a-z]######.txt 吗?
  • @amdixon,是的,所有文件
  • @John1024 它在 2 小时内被删除。

标签: linux bash rename


【解决方案1】:

您需要为此制作自己的 shell 脚本。

执行以下步骤

1) 准备该目录中的文件列表

2) 为该列表中的每个文件运行循环,然后处理其文件名并将其 numbrec 值增加 1,然后使用 mv 命令替换该文件。

一切顺利...

【讨论】:

    【解决方案2】:

    rename.sh

    #!/bin/bash
    
    for fname in $(ls * | grep -E '^([a-zA-Z]){2}([0-9]){6}.txt$');
    do
      prefix=${fname:0:2};
      prev_nbr=${fname:2:6};
      curr_nbr=$(expr $prev_nbr + 100);
      new_name=$(printf "%s%06d.txt\n" $prefix $curr_nbr);
      mv "$fname" "$new_name";
    done;
    

    输出

    $ touch aa006793.txt ab006794.txt 
    $ ls
    aa006793.txt  ab006794.txt  rename.sh
    $ ./rename.sh 
    $ ls
    aa006893.txt  ab006894.txt  rename.sh
    

    【讨论】:

    • amdixon,非常感谢!
    • don't parse the output of ls (而ls * 真的很蠢)。另外,不要在 Bash 脚本中使用 $(expr ...):shell 包含很多或算术功能!
    • 用户已确认所有文件都以特定方式命名,不包含空格或其他能够导致解析 ls 输出问题的字符。在这种情况下,可以解析 ls 输出
    • 不,这不好!查看您正在使用的命令:ls *。上帝!!!你正在使用ls *!然后用grep 过滤。如果您有太多文件以超过最大参数数量,ls * 将中断。此外,OP 说他想考虑的所有文件都遵循这个约定,但他没有说明文件夹中的所有文件。
    • 另外,$(expr ...)$(printf ...) 在 Bash 中是愚蠢的。
    猜你喜欢
    • 2013-12-05
    • 2014-05-16
    • 2014-11-08
    • 2014-10-09
    • 2019-02-05
    • 2015-02-28
    • 2020-01-29
    • 2013-08-20
    • 2014-11-29
    相关资源
    最近更新 更多