11

我在多个目录中有照片。我想使用 jpegtran (命令行工具)递归地遍历每一个,优化它,并保存它(覆盖它)

如果它们都在一个文件夹中,我会使用它

for JPEG in *.jpg ; do jpegtran -optimize $JPEG > $JPEG; done

但我不能让它递归工作并覆盖同一个文件(而不是一个新的文件名)

有小费吗?

4

4 回答 4

26

jpegtran 整个目录

find /the/image/path -name "*.jpg" -type f -exec jpegtran -copy none -optimize -outfile {} {} \;
于 2013-04-07T08:10:42.073 回答
5

如何使用find命令:

find /your/dir -name '*.jpg' -exec echo jpegtran -optimize {} \;

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

于 2012-10-11T02:58:17.830 回答
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中定义明确甚至不支持的操作。

于 2012-10-11T03:00:00.933 回答
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 概念。

于 2021-10-21T07:56:49.790 回答