3

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

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

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

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

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

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

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

4

2 回答 2

4

我认为主要问题是:如何获取 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
于 2013-07-15T11:01:12.057 回答
3

您正在寻找子字符串提取

语法是${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
于 2013-07-15T11:01:01.740 回答