0

非常に大きくなる可能性のあるログ ファイルのコレクションを定期的に送信する必要があるため、各ファイルの最後のn行のみを送信したいと考えています。

例えば:

/usr/local/data_store1/file.txt (500 lines)
/usr/local/data_store2/file.txt (800 lines)

という名前の必要なファイルのリストを含むファイルが与えられた場合、files.txtこれらの各ファイルの最後の 100 行を含むアーカイブ (tar または zip) を作成したいと思います。

末尾のファイルを含む別のディレクトリ構造を作成することでこれを行うことができますが、それを達成するために発生する可能性のあるパイプマジックがおそらくある場合、それはリソースの浪費のように思えます. ファイルが異なるディレクトリに同じ名前を持つ可能性があるため、完全なディレクトリ構造も保持する必要があります。

可能であればソリューションをシェルスクリプトにしたいと思いますが、perl (追加モジュールなし) も受け入れられます (これは、ruby/python/etc がインストールされていない Solaris マシン用です)。

4

5 に答える 5

1

全体像を見るのではなく、特定の実装に焦点を合わせています。

最終的な目標が、転送されるデータの量を最小限に抑えながらターゲット マシンにファイルの正確なコピーを保持することである場合、使用する必要があるのは rsync です。これは、ファイルの変更された部分のみを自動的に送信し、同時に圧縮することもできます。受信しながら送信および解凍します。

rsync を実行するのに、ターゲット マシンで標準の sshd デーモンのようにデーモンを追加する必要はありません。また、パスワードなしで自動転送をセットアップするには、公開鍵認証を使用するだけで済みます。

于 2009-05-18T20:24:55.797 に答える
0

logrotateを使用します。

例については、内部/etc/logrotate.dをご覧ください。

于 2009-02-05T20:03:21.147 に答える
0

そのためのパイプマジックはありません。必要なフォルダー構造を作成して、それを圧縮する必要があります。

mkdir tmp
for i in /usr/local/*/file.txt; do
    mkdir -p "`dirname tmp/${i:1}`"
    tail -n 100 "$i" > "tmp/${i:1}"
done
zip -r zipfile tmp/*
于 2009-02-05T16:06:08.957 に答える
-1

ログファイルをSCMに入れてみませんか?

受信者は自分のマシンにリポジトリを作成し、そこからファイルをチェックアウトして取得します。

コミットするだけでファイルを送信します。差分のみが送信されます。

于 2009-02-05T16:01:13.740 に答える