如何递归地使用JpegTran(命令行)来优化所有子目录中的文件?

11
我有多个文件夹中的照片。我想使用jpegtran(命令行工具)递归地访问每一个,对其进行优化,并保存它(覆盖它)。
如果它们都在一个文件夹中,我会使用以下方法。
for JPEG in *.jpg ; do jpegtran -optimize $JPEG > $JPEG; done

但我无法递归地将其工作并覆盖相同的文件(而不是转到新文件名)。

有什么提示吗?

4个回答

25

批量压缩jpeg图片

find /the/image/path -name "*.jpg" -type f -exec jpegtran -copy none -optimize -outfile {} {} \;

5
如何使用“find”命令:
find /your/dir -name '*.jpg' -exec echo jpegtran -optimize {} \;

运行该命令,如果您喜欢输出结果,则删除echo以执行它。


jpegtran 默认将输出到标准输出(stdout)。 - Ярослав Рахматуллин

3

在这种情况下,使用find通常更容易,因为您要做的是对一些文件名进行操作。 find实用程序将提供这些名称。 假设您拥有GNU(甚至可能是BSD)工具,则以下示例将说明这种常见情况。

例如:

$ find ~/images/wallpapers/TEMP/ -type f -iname '*jpg' \
    -exec sh -c 'jpegtran -outfile {}.out -optimize {}; mv {}.out {} ' \;
  1. find会递归查找TEMP文件夹中所有以jpg结尾的文件。
  2. 对于每个找到的完整文件路径(用`{}`表示),find将运行给定的-exec命令。
  3. -exec选项通过sh运行多个命令,而不是一个命令。

注释

cat file > file不被允许,因为在bash中同时读取和写入同一文件不是一个定义良好甚至支持的操作。


0

谈论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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接