递归地触摸并 gzip 目录中的所有 HTML、CSS、JS 文件

递归地触摸并 gzip 目录中的所有 HTML、CSS、JS 文件

我正在尝试优化 Nginx 服务器。我已启用 Gzip_Static_Module 来提供预压缩的 gzip 静态文件,例如 CSS、JS、HTML。

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 压缩,然后使用 touch 将 gzip 的 mtime 和 atime 设置为相应源文件的 mtime 和 atime(如Nginx 文档建议)。

答案4

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

相关内容