【问题标题】:Rename files based on symbols in the name根据名称中的符号重命名文件
【发布时间】:2013-07-13 04:45:30
【问题描述】:

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

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

我需要在其他文件夹中制作每个文件的副本(我们将其命名为 output)并根据文件名中的数字重命名每个文件,如下所示(在伪代码中):

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

如您所见,重命名涉及在文件名中获取某个符号,有时还会在文件名中获取某些符号的总和。

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

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

【问题讨论】:

标签: bash scripting renaming


【解决方案1】:

您正在寻找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

【讨论】:

    【解决方案2】:

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

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

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

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

    #!/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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-10
      • 2017-03-28
      • 1970-01-01
      • 2017-12-23
      • 2016-11-10
      相关资源
      最近更新 更多