1

我有一个目录树,其中有一些文件和一些子目录。

/
/file1.txt
/file2.png
/dir1
    /subfile1.gif

目标是有一个脚本生成每个文件的 gzip 版本并将其保存在每个文件旁边,并添加.gz后缀:

/
/file1.txt
/file1.txt.gz
/file2.png
/file2.png.gz
/dir1
    /subfile1.gif
    /subfile1.gif.gz

这将处理新.gz文件的创建。

另一部分是删除:每当创建非 gzip 压缩文件时,脚本.gz在运行时都需要删除孤立版本。

最后也是最棘手的部分是修改:每当更改某些(非 gzip 压缩的)文件时,重新运行脚本将.gz仅更新那些已更改文件的版本,基于文件mtime与其 gzip 版本之间的文件时间戳 () 比较。

是否可以在 bash 中实现这样的脚本?

编辑:这样做的目的是为 nginx 准备每个文件的压缩副本,以便使用 gzip_static 模块提供服务。它并不是一个后台服务,一旦发生任何变化,它就会自动压缩,因为 nginx 的 gzip_static 模块足够智能,可以在不存在压缩版本时提供来自未压缩版本的内容,或者如果未压缩版本的时间戳比gzip 版本的时间戳。因此,这是一个偶尔运行的脚本,只要服务器不忙。

4

2 回答 2

2

这是我的尝试:

#!/bin/bash
# you need to clean up .gz files when you remove things
find . -type f -perm -o=r -not -iname \*.gz | \
while read -r x
do
    if [ "$x" -nt "$x.gz" ]; then
        gzip -cn9 "$x" > "$x.gz"
        chown --reference="$x" "$x.gz"
        chmod --reference="$x" "$x.gz"
        touch --reference="$x" "$x.gz"
        if [ `stat -c %s "$x.gz"` -ge `stat -c %s "$x"` ]; then
            rm "$x.gz"
        fi
    fi
done

从这里偷走了大部分:https ://superuser.com/questions/482787/gzip-all-files-without-deleting-them

变化包括:

  • 跳过 .gz 文件
  • 添加 -9 和 -n 以使文件更小
  • 删除最终变大的文件(不幸的是,这意味着每次运行脚本时都会重试它们。)
  • 确保压缩文件的所有者、权限和时间戳与原始文件匹配
  • 仅适用于所有人都可读的文件
于 2012-10-13T08:07:43.830 回答
1

像这样的东西,也许?

#!/bin/sh

case $1 in
  *.gz )
    # If it's an orphan, remove it
    test -f "${1%.gz}" || rm "$1" ;;
    # Otherwise, will be handled when the existing parent is handled
  * )
    make -f - <<'____HERE' "$1.gz"
%.gz: %
    # Make sure you have literal tab here!
    gzip -9 <$< >$@
____HERE
    ;;
esac

如果您已经有 Makefile,请务必使用文字文件而不是此处的文档。

find左结合作为练习。如果要保存进程,您可能希望接受多个目标文件并循环它们。

于 2012-05-10T09:37:54.220 回答