2016-08-16 6 views
0

У меня есть тысячи изображений, которые я оптимизирую еженедельно, запустив его поверх cronjob. Моя проблема в том, что он также ищет оптимизированные изображения, которые понижают процессор. Как я могу сохранить последнее сканирование/оптимизацию и начал оптимизировать файлы и папки после этой даты?jpegoptim save shell последний запуск и проверка файлов или папок после этой даты

Мой код

find . -name '*.jpg' | xargs jpegoptim --strip-all 
find . -name '*.jpg' | xargs jpegoptim --all-progressive 
chmod -R 777 * 
+0

'найти | xargs' на самом деле небезопасно, если не использовать '-print0' на стороне' find' и '-0' на стороне' xargs' (к сожалению, это обе опции, отличные от POSIX, но, к счастью, они найдены в современных версиях обе стороны GNU и BSD мира). 'xargs' обрабатывает кавычки и пробелы в именах файлов как синтаксические, поэтому использование исходного кода, если ваши имена не контролируются строго, может привести к пропуску, по крайней мере, содержимого. –

+1

BTW, 'chmod 777' - ** очень ** плохой практика. Предоставление каждому пользователю вашей системы, который включает в себя «nobody» - разрешение на запись в файл, означает, что программное обеспечение, которое операционная система работает как ненадежный пользователь **, потому что это программное обеспечение считается обрабатывающим потенциально вредоносные данные ** может писать к вашему контенту. 'ssh' запускает код на раннем этапе процесса установления связи (до аутентификации учетных данных удаленной системы), например. Как правило, 'o + w' должен * никогда * быть выполненным, и это вдвойне верно для' o + wx'. –

+0

(Теперь, как правило, есть еще другая песочница - «chroot» и т. П. - но chroot на Linux намного проще обойти, чем должно быть - если это не так, в конце концов, не следует запускать недоверенные компоненты песочницы-демона как «никто»). –

ответ

1

Легче всего сделать, это коснуться файла, чтобы отслеживать самое последнее время обработки, и сказать find ограничивать себя к содержимому новее, чем этот файл.

Чтобы сохранить прежнюю семантику, где мы бежали две отдельных проходов, завершая все инвокации jpegoptim в одном режиме, прежде чем переходить к другим:

#!/bin/bash 

extra_args=() 
[[ -e last-scan ]] && extra_args=(-newer last-scan) 

find . -name '*.jpg' "${extra_args[@]}" -exec jpegoptim --strip-all '{}' + 
find . -name '*.jpg' "${extra_args[@]}" -exec jpegoptim --all-progressive '{}' + 
touch last-scan 

В качестве альтернативы, рассмотреть следующие вопросы:

#!/bin/bash 

extra_args=() 
[[ -e last-scan ]] && extra_args=(-newer last-scan) 

find . -name '*.jpg' "${extra_args[@]}" \ 
    -exec sh -c 'jpegoptim --strip-all "[email protected]"; jpegoptim --all-progressive "[email protected]"' _ '{}' + 

touch last-scan 

в последнем подходе, мы делаем только один find проход, а затем прохождение каждого пакета файлов в оболочку, которая responsib le для запуска jpegoptim в каждом режиме, в свою очередь, для этой партии.


Наконец: еслиjpegoptim является безопасным для одновременного использования, вы можете сделать следующее:

#!/bin/bash 

extra_args=() 
[[ -e last-scan ]] && extra_args=(-newer last-scan) 

find . -name '*.jpg' "${extra_args[@]}" \ 
    -exec jpegoptim --strip-all '{}' + \ 
    -exec jpegoptim --all-progressive '{}' + 
touch last-scan 

Здесь мы имеем один find проход непосредственно начиная оба экземпляра jpegoptim; риск здесь заключается в том, что если jpegoptim --strip-all и jpegoptim --all-progressive не могут безопасно работать с одним и тем же файлом одновременно, это может сильно испортиться.

+0

Для поиска внутри подпапки 'find images/-name '* .jpg'' – karadayi

+0

@karadayi, ... слово« подкаталог »; «папка» - это Windowsism –