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ファイルの作成が処理されます。

もう 1 つの部分は削除です。gzip されていないファイルが作成されるたびに、スクリプトは.gz実行時に孤立したバージョンを削除する必要があります。

最後の最も厄介な部分は変更です。一部の (gzip されていない) ファイルが変更されるたびに、スクリプトを再実行すると、ファイルと gzip されたバージョンのファイル タイムスタンプ ( ) の比較.gzに基づいて、変更されたファイルのみのバージョンが更新されます。mtime

そのようなスクリプトを 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演習として left との統合。プロセスを保存したい場合は、複数のターゲット ファイルを受け入れてそれらをループすることができます。

于 2012-05-10T09:37:54.220 に答える