【问题标题】:How to recursivly use JpegTran (command line) to optimise all files in subdirs?如何递归地使用 JpegTran(命令行)来优化子目录中的所有文件?
【发布时间】:2012-10-01 15:06:42
【问题描述】:
我在多个目录中有照片。我想用 jpegtran(命令行工具)递归地遍历每一个,优化它,并保存它(覆盖它)
如果它们都在一个文件夹中,我会使用它
for JPEG in *.jpg ; do jpegtran -optimize $JPEG > $JPEG; done
但我不能让它递归工作并覆盖同一个文件(而不是一个新的文件名)
有什么建议吗?
【问题讨论】:
标签:
macos
bash
command-line
operating-system
jpeg
【解决方案1】:
使用find 命令怎么样:
find /your/dir -name '*.jpg' -exec echo jpegtran -optimize {} \;
运行命令,如果你喜欢输出,删除echo即可执行。
【解决方案2】:
在这种情况下使用 find 通常要容易得多,因为您要做的是 act 处理几个文件名。 find 实用程序将为您提供这些名称。假设您有 GNU(甚至可能是 BSD)工具,以下示例将说明这种常见情况。
例如:
$ find ~/images/wallpapers/TEMP/ -type f -iname '*jpg' \
-exec sh -c 'jpegtran -outfile {}.out -optimize {}; mv {}.out {} ' \;
-
find 递归查找 TEMP 文件夹中所有以 jpg 结尾的文件。
- 对于找到的每个完整文件路径(用“{}”表示),find 将运行提供给 -exec 的命令
- -exec 选项作弊并通过 sh
运行多个命令而不是一个命令
备注
cat file > file 是不允许的,因为在 bash 中同时读取和写入同一个文件并不是一个明确定义甚至不支持的操作。
【解决方案3】:
jpegtran whole directory
find /the/image/path -name "*.jpg" -type f -exec jpegtran -copy none -optimize -outfile {} {} \;
【解决方案4】:
谈 Python 方法:
首先列出所有路径。
然后:
import subprocess
for path in paths:
for image_name in arr:
subprocess.call(["jpegtran", "-your", "-instructions"])
假设你的指令是这样的:
jpegtran -optimize -progressive -scans script_new.txt -outfile progressive.jpg original.jpg
所以你的指令会是这样的:
subprocess.call(["jpegtran", "-optimize", "-progressive", "-scans", f"{scan_name}.txt", "-outfile", name_progressive, name_original])
为方便起见,name_progressive、name_original 和 scan_name 是变量,使用概念 f-string。