我有一个包含大量图像文件的目录,其中一些位于子目录中。我需要*.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 填充为六位数字。