根据名称中的符号重命名文件

时间:2013-07-15 10:37:06

标签: bash scripting renaming

我有很多这样的文件(图像)(文件名只由数字组成):

123456.jpg
369258.jpg
987123.jpg
...

我需要在其他文件夹中复制每个文件夹(让我们将其命名为 output )并根据其名称中的数字重命名每个文件,如下所示(在伪代码中):< / p>

outputFileName = String(filename[0]) + String(filename[1]) + String(filename[2]+filename[3]) + ".jpg"

正如您所看到的,重命名涉及在文件名中获取某个符号,有时会在文件名中获得一些符号的总和。

我需要制作一个脚本,在我根据类似算法放置脚本的文件夹中批量重命名所有* .jpg,并在前面提到的 output 文件夹中输出重命名的文件。

这个脚本应该可以从macos终端和windows通过cygwin shell工作。

2 个答案:

答案 0 :(得分:4)

我假设主要问题是:如何获取bash变量的特定字符以及如何在bash中执行添加。

  1. 要从bash变量中获取char,您可以使用以下格式:${var:START_INDEX:LENGTH}

  2. 执行添加:$((ARG1 + ARG2))

  3. 您生成的脚本可能是这样的:

    #!/bin/bash
    
    for f in *.jpg
    do
      output=${f:0:1}${f:1:1}$((${f:2:1} + ${f:3:1})).jpg
      mv -- "$f" "$output"
    done
    

答案 1 :(得分:3)

您正在寻找substring extraction

语法为${string:position:length},其中string是变量的名称,position是起始位置(0是第一个索引),length是子字符串的长度。

将创建问题中指定的文件名的脚本,并将名为“input”的文件夹复制到名为“output”的文件夹中的脚本可能如下所示:

#!/bin/bash
for file in input/*.jpg
do
    filename="$(basename "$file")"
    firstChar="${filename:0:1}"
    secondChar="${filename:1:1}"
    thirdAndFourthChar="$(( ${filename:2:1} + ${filename:3:1} ))"
    newfilename="$firstChar$secondChar$thirdAndFourthChar.jpg"
    cp "$file" "output/$newfilename"
done