如何将许多文件从任意文件名重命名为连续文件名?

如何将许多文件从任意文件名重命名为连续文件名?

我有一个包含 8,000 张图像的目录。这些文件有多种文件名,类型为 jpeg 或 png。

我想将它们重命名为:

pic00001.png
pic00002.jpg

我不介意我是否最终在一次运行中执行 png,在另一次运行中执行 jpeg,最终得到两个稍微重叠的集合 - pic00001.png、pic00002.png 和 pic00001.jpeg、pic00002.jpeg

当前有关 SE 的问题涉及批量重命名(如果您采用现有文件名并添加或删除静态信息)。我不会那样做。我用递增的数字替换整个文件名。

答案1

您可以使用 shell 循环来完成此操作,例如:

for f in *.jpeg *.png
do  printf "mv '%s' pic%05d.%s \n" "$f" $((++c)) "${f##*.}"
done | sh

该程序通过运行一次序列号创建一个序列,并保留原始文件扩展名。

注意:创建命令或命令序列并将结果传递到 shell 中的技术是标准编码模式。您可以先运行程序,而不使用最终管道来sh检查创建的命令是否适合,如果一切看起来都很好,则附加最终管道。 (与临时添加(如常见的)相反,echo管道到外壳方法会创建持续的输出。)

但请注意(正如吉尔斯指出的),在给定的情况下,包含单引号的文件名将为相应的文件名创建错误的结果。如果不需要预检查工具,可以直接执行命令,如下所示:

for f in *.jpeg *.png
do
  ((++c))
  new_f=$( printf "pic%05d.%s" $c "${f##*.}" )
  mv "${f}" "${new_f}"
done

(对于偏执者:当然,在某些情况下,这些解决方案也无法按预期工作;例如,如果某些现有文件已经符合目标文件名格式;在这种情况下,您将创建/移动将文件复制到新的临时目录以避免损坏各个文件。)

相关内容