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

时间:2018-11-17 11:20:28

标签: bash shell find batch-processing webp

我有一个目录,其中有几百万个图像随机放置在其他子目录中。 我想通过添加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版本的)

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

2 个答案:

答案 0 :(得分:1)

您可以测试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"'

:-)

答案 1 :(得分:0)

要仅列出没有对应的.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,所以这似乎不是问题。