我有一个目录,其中有几百万个图像随机放置在其他子目录中。 我想通过添加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.jpg
和subdir/4.jpg
? (没有webp版本的)
此外,无法按时间搜索,因为新照片的修改时间可能比上次运行的时间更早。
答案 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
,所以这似乎不是问题。