我尝试使用mozcjpeg优化sample.jpg,但我希望它能压缩sample.jpg,而不是创建另一个文件。
我运行此命令:
mozcjpeg -quality 80 sample.jpg > sample.jpg
我得到了
Empty input file
做正确的方法是什么?
P.S。我有一个每天运行一次的bash脚本来优化过去24小时内创建的图像。
答案 0 :(得分:0)
只需使用不同的输出文件名,否则会立即覆盖。
答案 1 :(得分:0)
您正在读取文件并同时覆盖它。而是制作一个中间文件:
tmp_file="$(mktemp)"
mozcjpeg -quality 80 sample.jpg > "${tmp_file}"
mv "${tmp_file}" sample.jpg
答案 2 :(得分:0)
anycmd foo.jpg > foo.jpg
被理解为:
foo.jpg
进行写入(覆盖所有现有数据)。anycmd foo.jpg
。因此,在执行命令时,原始文件已经消失了。您该如何解决?
好吧,您可以创建一个临时文件as suggested in the other answer。
或者,您可以使用sponge
。它是moreutils软件包的一部分。
$ whatis sponge
sponge (1) - soak up standard input and write to a file
该工具允许您编写:
mozcjpeg -quality 80 sample.jpg | sponge sample.jpg
之所以起作用,是因为sponge
将首先读取所有(内存中的)stdin,并且只有在stdin到达EOF之后,它才会打开文件进行写入。