касание и gzip весь HTML, CSS, файлы JS в каталоге рекурсивно

Ваша проблема связана с перезаписью вывода на каждой итерации. >перенаправление обрезает(пустой )файл, в который вы перенаправляете.

Другой подход. :Сортируйте каждый файл по отдельности с помощью sort -u, чтобы получить записи, уникальные для этого файла, затем объединяйте результаты этих операций сортировки и пропускайте их через sort | uniq -c, чтобы получить сумму количества раз, когда каждый запись появляется во всех файлах. Затем просмотрите этот результат и выберите записи, количество которых равно количеству файлов. Это записи, которые встречаются во всех файлах.

set --./*.txt

for file do
    sort -u "$file"
done | sort | uniq -c |
awk -v c="$#" '$1 == c { print $2 }'

Здесь я использую позиционные параметры, устанавливая их в список файлов, которые мы хотели бы перебрать с помощью set --./*.txt. Я делаю это для того, чтобы мы могли использовать $#позже, то есть количество файлов в списке.

Для трех первых наборов данных, которые вы показываете, это выведет

3
6
7
2
27.04.2014, 21:47
3 ответа

Моя версия:

IFS=$'\0' find $DIR -type f -iname \*.html -or -iname \*.css -or -iname \* .js | пока читаем фн; do gzip -9vk -- "$fn" && touch -r "$fn" "${fn}.gz"; done

Обновление

gzip на самом деле хранит время модификации, необходимое nginx для проверки того, контент тот же, поэтому достаточно более простой строки:

find public/ -type f -iname \ *.html -или -инаме \*.css -или -инаме \*.js -или -инаме \*.xml -print0 | xargs --null --no-run-if-empty --verbose gzip -9vk --

-1
27.01.2020, 23:01

Более краткий способ:

DIR=/var/www
gzip -rk9 $DIR &&\
find $DIR -not -name '*.gz' -type f -exec touch -r {} {}.gz \;

Это gzip-архивирует все (на «лучшем» уровне) в вашем каталоге www, а затем использует touch, чтобы установить mtime и atime gzip на соответствующие исходные файлы (как nginx docs предлагают).

0
27.01.2020, 23:01
find dist -type f -exec sh -c "gzip < '{}' > '{}'.gz" \;
-1
27.01.2020, 23:01

Теги

Похожие вопросы