2012-05-10 1 views
1

ファイルといくつかのサブディレクトリがあるディレクトリツリーがあります。Bash:ファイルセットとそのgzipped同等物の維持

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

これは新しいの作成を処理します:

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

目的は、各ファイルのgzip圧縮されたバージョンを生成して、コメントを追加し.gz接尾辞で、各ファイルの隣にそれを保存したスクリプトを持つことです.gzファイル。

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

最後とトリッキーな部分は修正である:たび、ファイルの間にいくつかの(非gzip圧縮された)ファイルのタイムスタンプに基づいて、ファイルを再実行するのみ変更されたファイルの.gzバージョンを更新するスクリプトを、変更された(mtime)の比較とそのgzippedバージョン。

このようなスクリプトをbashで実装することはできますか?

編集:これは、gzip_staticモジュールを使用して提供するnginxの各ファイルの圧縮コピーを用意しておくことを目的としています。 nginxのgzip_staticモジュールは、圧縮されたバージョンが存在しない場合、あるいは圧縮されていないバージョンのタイムスタンプが最新でない場合、非圧縮バージョンのコンテンツを提供するのに十分スマートなので、何かが変わるとすぐに物事を自動的に圧縮するバックグラウンドサービスではありません。 gzippedバージョンのタイムスタンプ。したがって、これは、サーバがビジーでないときはいつでも実行されるスクリプトです。

+3

[何を試しましたか](http://mattgemmell.com/2008/12/08/what-have-you-tried/)?信じられないかもしれませんが、これは*重要な仕事量であり、あなたは単純にその仕事を無料で委託したいと思われます。私はあなたが問題を解決するのを助けてくれることをうれしく思っています。 –

+0

これは、nginxが-9 gzを用意しておきたいとしましょう。コピー用のスクリプトを作ってみませんか?ディレクトリに両方のバージョンを持つ利点はありません –

+1

少なくとも、よく定義された問題ですが、良い書式と問題の説明のために+1しますが、私はTimに同意します。 Etienneが欠けているものが1つあります。あなたの説明は、このすべてが自動的にサービスとしてバックグラウンドで実行されるように思えます。これがあなたの意図ならば、もっと明確にしてください。引数を受け入れ、コマンドラインから実行するいくつかのユーティリティスクリプトがほしいだけなら、それも言ってください。がんばろう。 – shellter

答えて

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 <$< >[email protected] 
____HERE 
    ;; 
esac 

すでにMakefileを持っている場合は、すべての手段によって、文字通りのファイルではなく、ここで文書を使用しています。

findとの統合は練習として残しました。プロセスを保存する場合は、複数のターゲットファイルを受け入れてループバックすることができます。ここで

+0

ありがとう、 'make'ソリューションはこれに対して本当に優雅です。 –

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ファイルを小さくする
  • larになったファイルを削除するGER(残念ながらこれは、彼らはあなたがスクリプトを実行するたびに再試行されることを意味します。)
  • は、所有者、アクセス許可を確認しました、そして圧縮されたファイルのタイムスタンプは、元
  • だけ皆
  • によって読み取り可能ですファイル上で動作一致しました
+0

大きくなったファイルのリストをキャッシュする小さなファイルを作成できますか?おそらくそのファイルにCRC32を格納していますか? – hexafraction

関連する問題