Macos 如何递归使用JpegTran(命令行)优化子文件夹中的所有文件?

Macos 如何递归使用JpegTran(命令行)优化子文件夹中的所有文件?,macos,bash,command-line,operating-system,jpeg,Macos,Bash,Command Line,Operating System,Jpeg,我有多个目录中的照片。我想使用jpegtran(命令行工具)递归地检查每一个,优化它,并保存它(覆盖它) 如果它们都在一个文件夹中,我使用这个 for JPEG in *.jpg ; do jpegtran -optimize $JPEG > $JPEG; done 但是我不能让它递归工作并覆盖同一个文件(而不是新的文件名) 有什么提示吗?使用find命令如何: find /your/dir -name '*.jpg' -exec echo jpegtran -optimize {} \

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

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

for JPEG in *.jpg ; do jpegtran -optimize $JPEG > $JPEG; done
但是我不能让它递归工作并覆盖同一个文件(而不是新的文件名)


有什么提示吗?

使用
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 {} ' \;
  • find递归查找TEMP文件夹中以jpg结尾的所有文件
  • 对于找到的每个完整文件路径(用“{}”表示),find将运行给-exec的命令
  • -exec选项欺骗并运行多个命令,而不是通过sh
  • 注释

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


    jpegtran在标准输出上有默认输出。
    find /the/image/path -name "*.jpg" -type f -exec jpegtran -copy none -optimize -outfile {} {} \;