【发布时间】:2017-04-25 11:58:14
【问题描述】:
我正在尝试使用 mozcjpeg 优化 sample.jpg,但我希望它压缩 sample.jpg,而不是创建另一个文件。
我运行这个命令:
mozcjpeg -quality 80 sample.jpg > sample.jpg
我得到了
Empty input file
正确的做法是什么?
附:我有一个每天运行一次的 bash 脚本来优化过去 24 小时内创建的图像。
【问题讨论】:
我正在尝试使用 mozcjpeg 优化 sample.jpg,但我希望它压缩 sample.jpg,而不是创建另一个文件。
我运行这个命令:
mozcjpeg -quality 80 sample.jpg > sample.jpg
我得到了
Empty input file
正确的做法是什么?
附:我有一个每天运行一次的 bash 脚本来优化过去 24 小时内创建的图像。
【问题讨论】:
只需使用不同的输出文件名,否则会立即被覆盖。
【讨论】:
您正在读取文件并同时覆盖它。相反,制作一个中间文件:
tmp_file="$(mktemp)"
mozcjpeg -quality 80 sample.jpg > "${tmp_file}"
mv "${tmp_file}" sample.jpg
【讨论】:
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 将首先读取所有标准输入(在内存中),并且只有在标准输入到达 EOF 后才会打开文件进行写入。
【讨论】: