Ваша проблема связана с перезаписью вывода на каждой итерации. >
перенаправление обрезает(пустой )файл, в который вы перенаправляете.
Другой подход. :Сортируйте каждый файл по отдельности с помощью 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
Моя версия:
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 --
Более краткий способ:
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 предлагают).