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



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

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

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

但是我无法让它递归工作并覆盖相同的文件(而不是新文件名)

有什么提示吗?

jpegtran whole directory

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

如何使用 find 命令:

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

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

在这种情况下,

使用 find 通常要容易得多,因为您要做的是对几个文件名进行操作查找实用程序将为您提供这些名称。假设你有GNU(甚至BSD)工具,下面的例子将说明这个常见的场景。

例如:

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

笔记

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

谈论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 字符串。

相关内容

  • 没有找到相关文章

最新更新