2

我正在尝试使用 mozcjpeg 优化 sample.jpg,但我希望它压缩 sample.jpg,而不是创建另一个文件。

我运行这个命令:

mozcjpeg -quality 80 sample.jpg > sample.jpg

我得到

Empty input file

正确的方法是什么?

PS 我有一个每天运行一次的 bash 脚本来优化过去 24 小时内创建的图像。

4

3 回答 3

0

您正在读取文件并同时覆盖它。相反,制作一个中间文件:

tmp_file="$(mktemp)"
mozcjpeg -quality 80 sample.jpg > "${tmp_file}"
mv "${tmp_file}" sample.jpg
于 2019-02-25T01:20:35.290 回答
0

只需使用不同的输出文件名,否则它会立即被覆盖。

于 2017-04-25T12:43:37.883 回答
0

anycmd foo.jpg > foo.jpg被理解为:

  • shell 将打开foo.jpg以进行写入(覆盖任何现有数据)。
  • shell 将分叉并将这个打开的文件设置为标准输出。
  • 外壳将 exec anycmd foo.jpg

因此,在执行命令时,原始文件已经消失了。你怎么能解决这个问题?

好吧,您可以按照另一个答案中的建议创建一个临时文件。

或者,您可以使用sponge. 它是moreutils包的一部分。

$ whatis sponge
sponge (1)           - soak up standard input and write to a file

该工具允许您编写:

mozcjpeg -quality 80 sample.jpg | sponge sample.jpg

它之所以起作用,是因为sponge将首先读取所有标准输入(在内存中),并且只有在标准输入到达 EOF 后,它才会打开文件进行写入。

于 2020-08-10T20:44:10.577 回答