Bash:维护一组文件及其gzip等效文件

Bash:维护一组文件及其gzip等效文件,bash,synchronization,directory,compression,gzip,Bash,Synchronization,Directory,Compression,Gzip,我有一个目录树,其中有一些文件和一些子目录 / /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文件时,脚本

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

/
/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)文件发生更改时,重新运行脚本将根据文件与其gzip版本之间的文件时间戳(
mtime
)比较,仅更新这些更改文件的
.gz
版本

可以在bash中实现这样的脚本吗


编辑:目的是为nginx准备每个文件的压缩副本,以便使用gzip_静态模块提供服务。它并不意味着是一个后台服务,一旦有任何变化就会自动压缩内容,因为nginx的gzip_静态模块足够智能,可以在不存在压缩版本的情况下,或者如果未压缩版本的时间戳比gzip版本的时间戳更近的情况下,提供来自未压缩版本的内容。因此,当服务器不忙时,这是一个偶尔运行的脚本。

可能是这样的吗

#!/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
#/垃圾箱/垃圾箱
每箱1元
*.gz)
#如果是孤儿,就把它移走
测试-f“${1%.gz}”| | rm“$1”;;
#否则,将在处理现有父级时处理
* )

make-f-以下是我的尝试:

#!/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
从这里偷走了大部分:

变化包括:

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

?信不信由你,这将是一项巨大的工作,而且你似乎只想免费外包这项任务。我很乐意帮助您解决一个问题,但您最好付钱给我,让我为您编写整个程序。假设您希望为nginx准备-9gz。你为什么不做一个复制脚本呢?我不认为在一个目录中同时使用两个版本有什么好处至少这是一个定义良好的问题;-)+1用于良好的格式设置和问题描述,但我同意Tim的观点,请向我们展示您的尝试。Etienne少了一件事,你的描述听起来像是你希望所有这些都自动发生,作为一项服务在后台运行。如果这是你的意图,请更加明确。如果您只需要一些接受参数并从命令行运行的实用程序脚本,请也这样说。祝你好运。你调查过inotify吗?(). 您可以编写一个脚本,当对每个文件的写入完成时,该脚本都会被唤醒。如果文件有.gz ext,只需忽略它,对于所有其他文件,请创建/重新创建。gz@TimPote那么,我需要听到的只是“重要的”。我已经使用
find
命令的
-exec
参数获得了一个部分功能脚本,但是它对于孤立文件或已经存在的
.gz
文件并不明智。如果在bash中没有相当简单的方法来实现这一点,那么这将回答我的问题,答案是“否”,我不想进一步尝试,而是用Python来实现;)@我不确定我是否明白你在说什么。“复制脚本”会做些什么,从而额外生成压缩副本@Sheller不,不是后台服务,但无人值守是的非常感谢,
make
解决方案确实非常优雅。你能创建一个小文件来缓存那些变大的文件列表吗?也许还可以将CRC32存储在该文件中?