Легче всего сделать, это коснуться файла, чтобы отслеживать самое последнее время обработки, и сказать 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
не могут безопасно работать с одним и тем же файлом одновременно, это может сильно испортиться.
'найти | xargs' на самом деле небезопасно, если не использовать '-print0' на стороне' find' и '-0' на стороне' xargs' (к сожалению, это обе опции, отличные от POSIX, но, к счастью, они найдены в современных версиях обе стороны GNU и BSD мира). 'xargs' обрабатывает кавычки и пробелы в именах файлов как синтаксические, поэтому использование исходного кода, если ваши имена не контролируются строго, может привести к пропуску, по крайней мере, содержимого. –
BTW, 'chmod 777' - ** очень ** плохой практика. Предоставление каждому пользователю вашей системы, который включает в себя «nobody» - разрешение на запись в файл, означает, что программное обеспечение, которое операционная система работает как ненадежный пользователь **, потому что это программное обеспечение считается обрабатывающим потенциально вредоносные данные ** может писать к вашему контенту. 'ssh' запускает код на раннем этапе процесса установления связи (до аутентификации учетных данных удаленной системы), например. Как правило, 'o + w' должен * никогда * быть выполненным, и это вдвойне верно для' o + wx'. –
(Теперь, как правило, есть еще другая песочница - «chroot» и т. П. - но chroot на Linux намного проще обойти, чем должно быть - если это не так, в конце концов, не следует запускать недоверенные компоненты песочницы-демона как «никто»). –