如何重命名目录内的所有图像文件(以及其子目录内的递归重命名)?

如何重命名目录内的所有图像文件(以及其子目录内的递归重命名)?

我有一个包含大量图像文件的目录,其中一些位于子目录中。我需要*.png, *.jpg, *.jpeg, *.bmp, *.gif使用简单的重命名模式重命名所有匹配的图像文件:

  • 相同字首对于所有文件;
  • A数字填充零并打印为十六进制字符串。

我的目标是为所有图像文件分配一个唯一的名称,与它们的扩展名无关,这样我就可以将它们转换为相同的图像格式,而不用担心覆盖具有相同名称的文件。

我正在编写一个脚本来执行上述过程(对于目录列表,我受到了以下代码片段的启发这个答案)。

for root, dirs, filenames in os.walk(path):
    for filename in filenames:
        if filename.endswith((".jpeg", ".jpg", ".png", ".gif", ".bmp")):
            # rename file

我想知道是否有任何 bash 或 powershell 命令可以执行上述过程。

答案1

我最擅长的是 Bash,但我确信你也可以在 Power Shell 中做同样的事情。我假设你要转换为 .jpg 格式并将所有文件存储在 ./output/ 目录中。我的脚本如下所示:

j=0;
for i in `find . -type f \( -iname *.jpg -o -iname *.jpeg -o -iname *.png -o -iname *.gif -o -iname *.bmp \)`
do
    j=$(($j+1))
    convert $i output/`printf "%06X" $j`.jpg
done

此脚本将从 0 开始计数器“$j”。然后,它会查找所有属于文件类型的文件(而不是目录、符号链接或其他类似的东西),并以不区分大小写的方式匹配您指定的扩展名。() 将一系列项目分组,每个项目都使用 find 命令的 -o OR 说明符连接在一起。

我们使用 for 循环遍历所有找到的文件,并用 $i 标记它们。

在循环内部,我增加计数器 $j。

然后我将找到的文件名转换为 .jpg 并输出到 ./output/ 目录中。

使用 printf 命令将十六进制文件名用 0 填充为六位数字。

相关内容