mozcjpeg - оптимизировать исходное изображение
Я пытаюсь оптимизировать sample.jpg с помощью mozcjpeg, но я хочу, чтобы он сжимал sample.jpg, а не создавал другой файл.
Я запускаю эту команду:
mozcjpeg -quality 80 sample.jpg > sample.jpg
и я получаю
Empty input file
Какой правильный способ сделать это?
PS У меня есть скрипт bash, который запускается один раз в день для оптимизации изображений, созданных за последние 24 часа.
1 ответ
anycmd foo.jpg > foo.jpg
понимается как:
- Оболочка откроется
foo.jpg
на запись (перезапись любых существующих данных). - Оболочка выполнит ответвление и установит этот открытый файл как стандартный вывод.
- Оболочка выполнит
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, он откроет файл для записи.
Вы читаете файл и перезаписываете его одновременно. Вместо этого создайте промежуточный файл:
tmp_file="$(mktemp)"
mozcjpeg -quality 80 sample.jpg > "${tmp_file}"
mv "${tmp_file}" sample.jpg
Просто используйте другое имя выходного файла, в противном случае он будет немедленно перезаписан.