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

Просто используйте другое имя выходного файла, в противном случае он будет немедленно перезаписан.

Другие вопросы по тегам