ディレクトリ内のすべての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" \;

関連情報