查找没有额外 webp 后缀的 jpg 图片

Find jpg images without an extra webp suffix

我有一个目录,其中有几百万张图片随机放置在其他子目录中。 我想通过附加 webp 扩展名为所有 jpg 图片生成 webp 图片,不考虑 gif 图片等其他格式。

我可以运行 ubuntu 18 下面的命令来生成我想要的所有 webp 图像,包括附加了 .webp 后缀的文件名:

find /home/photos -type f \( -iname \*.jpg -o -iname \*.jpeg \) | parallel -eta cwebp {} -o {}.webp

但是,我会及时将其他 jpg 图像添加到其他一些子目录中,我想再次 运行 相同的命令,仅适用于没有 .webp 后缀等效的新 jpg 图像。

如果我有:

-- 1.png
-- 1.gif
-- 2.jpg
-- 2.jpg.webp
-- 3.jpg
-- subdir/4.jpg
-- subdir/5.jpg
-- subdir/5.jpg.webp

如何只查找 3.jpgsubdir/4.jpg? (没有webp版本的)

此外,无法按时间搜索,因为新照片的修改时间可能比上一张更早运行。

要仅列出没有相应 .webp 文件的文件,您可以使用 grep,如下所示:

find /home/photos -type f \( -iname \*.jpg -o -iname \*.jpeg \) |
grep -vFxf <(find /home/photos -type f -name \*.webp | sed 's/\.webp$//')

检查输出,然后追加| parallel ...

我们使用 <(...) 创建一个匿名文件,其中包含所有 .jpg 文件,这些文件已经有相应的 .webp 文件。 grep 从标准输入中过滤掉所有这些行。

此方法不适用于包含换行符的路径。但是因为你一开始就没有使用 -print0,所以这似乎不是问题。

您可以测试 parallel 中是否存在输出文件,只有在它不存在时才创建它,如下所示:

find . -iname \*.jpg | parallel -eta 'out={}.webp; [ ! -f "$out" ] && cwebp {} -o "$out"'

或者,完全一样,但更努力地减少我的看法的消极程度:

find . -iname \*.jpg | parallel -eta 'out={}.webp; [ -f "$out" ] || cwebp {} -o "$out"'

:-)