디렉토리에 있는 모든 HTML, CSS, JS 파일을 반복적으로 터치하고 gzip합니다.

디렉토리에 있는 모든 HTML, CSS, JS 파일을 반복적으로 터치하고 gzip합니다.

Nginx 서버를 최적화하려고 합니다. CSS, JS, HTML과 같은 사전 압축된 gzip 정적 파일을 제공하기 위해 Gzip_Static_Module을 활성화했습니다.

Nginx Wiki에서는 압축된 파일과 압축되지 않은 파일의 타임스탬프가 일치한다고 말합니다. 그래서 Gzip 압축 전에 이 파일들을 만져보려고 합니다.

*.gz다음을 사용하여 이러한 정적 파일을 만지고 생성 하려고 합니다 .

$ su -c "find . -type f -name "*.css" -size +1024b -exec sh -c "touch {} \
    && gzip -9v < {} > {}.gz" \;"

$ su -c "find . -type f -name "*.js" -size +1024b -exec sh -c "touch {} \
    && gzip -9v < {} > {}.gz" \;"

$ su -c "find . -type f -name "*.html" -size +1024b -exec sh -c "touch {} \
    && gzip -9v < {} > {}.gz" \;"

하지만 "사용자{}를 찾을 수 없음" 오류가 발생합니다.

누구든지 위 명령의 문제점을 확인하도록 도와줄 수 있습니까? 압축되지 않은 파일의 타임스탬프가 변경될 때마다(예: Cronjob) *.gz를 자동으로 생성하는 더 좋은 방법이 있습니까?

답변1

su -c ...실행하려는 명령에 큰따옴표가 포함되어 있기 때문에 인용 문제가 있는 것 같습니다. 전체 내용을 작은따옴표로 묶는 것이 좋습니다.

$ su -c 'find . -type f -name "*.css" -size +1024b -exec sh -c "touch {} && \
    gzip -9v < {} > {}.gz" \;'

큰따옴표가 포함된 항목을 이스케이프 처리할 수도 있지만 이는 종종 디버깅을 혼란스럽게 만들기 때문에 이를 피하고 싶지만 스타일/취향 선호도에 따른 또 다른 옵션입니다.

답변2

왜 파일을 호출하기 전에 파일을 "터치"하고 싶습니까 gzip?

맨 페이지 gzip:

Gzip은 Lempel-Ziv 인코딩(LZ77)을 사용하여 지정된 파일의 크기를 줄입니다. 가능할 때마다 각 파일은 동일한 소유권 모드, 액세스 및 수정 시간을 유지하면서 확장명이 .gz인 파일로 대체됩니다.

파일을 전혀 건드릴 필요가 없습니다. 다음을 실행하세요.

$ su -c "find . -type f -name \"*.css\" -size +1024b -exec gzip -9vk '{}' \;

-k압축 후 원본 파일을 유지하는 옵션을 사용했습니다 . gzip이 옵션은 버전 1.6에서 도입되었습니다 gzip.

답변3

더 간결한 방법:

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

이는 www 디렉터리의 모든 내용을 "최상" 수준으로 압축한 다음 터치를 사용하여 gzip의 mtime 및 atime을 해당 소스 파일의 mtime 및 atime으로 설정합니다(예:Nginx 문서제안).

답변4

find dist -type f -exec sh -c "gzip < '{}' > '{}'.gz" \;

관련 정보