forループのtarコマンド

forループのtarコマンド

私はこれが基本的な質問であることを知っていますが、助けてください。tar次のコマンドを使用してサーバーログファイルを圧縮してアーカイブします。

for i in server.log.2016-07-05 server.log.2016-07-06 ; do tar -zcvf  server2.tar.gz $i; done

上のループの出力は次のとおりです。

server.log.2016-07-05
server.log.2016-07-06

ただし、tar -tvf server2.tar.gz 取得した出力を使用してファイルを一覧表示すると、

rw-r--r-- root/root 663643914 2016-07-06 23:59 server.log.2016-07-06

つまり、2つのファイルをアーカイブしましたが、1つのファイルのみが表示されます。これは、アーカイブにこれら2つのファイルが含まれておらず、アーカイブにすべてのファイルを含める必要があることを意味します。この問題を解決するのに役立ちます。

私はこれら2つのファイルをテストしましたが、私のフォルダに複数のファイルがあります。予期した出力が得られなかったため、フォルダ内のすべてのファイルに進んでいませんでした。私が使いたい正確なループは

Previousmonth=$(date "+%b" --date '1 month ago')

for i in $(ls -l | awk '/'$Previousmonth'/ && /server.log./ {print $NF}');do;tar -zcvf server2.tar.gz $i;done

答え1

ループが実行されるたびに、tarputコマンドが実行されます。一つファイル対ファイルserver2.tar.gz。ファイルは最終的に1つのファイルになります。

tarオプションを使用してファイルを添付します。

tar --append -zcvf server2.tar.gz "$i"

または、単にファイルのリストをtarに入力してください(このコマンドを使用しないでください):

tar -zcvf server2.tar.gz  $(ls -l|awk '/'$Previousmonth'/&&/server.log./{print $NF}')

ただし、このコマンドラインにはいくつかの問題があります。

  • 解析ls出力(エラー)。
  • 引用符なしで使用してください$Previousmonth(エラー)。
  • スペースを含む可能性のあるファイルのリストを作成します(信頼できません)。

代わりに、次のコマンド(ペア)を使用してください。

month=$(date "+%Y-%m-" --date '1 month ago')
find ./ -name "server.log.${month}*" -exec tar -zcvf server2.tar.gz '{}' \+

答え2

元の質問に答える

解決策はループを使用しないことですfor。毎回ファイルを上書きします。代わりに、以下を使用してください。

tar -zcvf server2.tgz server.log.2016-07-05 server.log.2016-07-06

これにより、同じアーカイブにコマンドラインにリストされているファイルの数が追加されます。

修正された質問に答えてください

7月のすべてのファイルを圧縮するには:

tar -zcvf server2.tgz server.log.2016-07-*

または、ファイルの種類に関係なく、前月のすべてのファイルを圧縮するには、次の手順を実行します。

tar -zcvf server2.tgz server.log.$(date "+%Y-%m" --date '1 month ago')-*

答え3

@John1024 もう与えてくれました良い答えしかし、何かを追加する必要があると思いました。

場合によっては、次のものが必要な場合があります。tar既存のアーカイブにファイルを追加する。たとえば、毎月のログファイルのアーカイブがあり、毎晩深夜にログファイルの循環が発生した後、そのアーカイブに毎日のログファイルを追加したいとします。

アーカイブが/data/logs/logfiles-2016-08.tar8月に呼び出され、ローテーションされたログファイル自体が特定の日付で呼び出される場合/var/log/servicename-2016-08-06.log(さまざまな値についてservicename)、午前3時に次のタスクを実行するクローンタスクによって呼び出される小さなスクリプトがある可能性があります。

#!/bin/sh

yyyymm="$( date --date="1 day ago" +"%Y-%m" )"
yyyymmdd="$( date --date="1 day ago" +"%Y-%m-%d" )"

for logfile in /var/log/*-$yyyymmdd.log; do
  tar -r -C /var/log -f "/data/logs/logfiles-$yyyymm.tar" "${logfile##*/}" &&
  rm "${logfile##*/}"
done

この-rフラグは、tarアイテムをアーカイブに追加するように指示します。この-Cフラグは、ログファイルにアクセスする前にディレクトリの変更を示すために使用されますtar/var/logこの-fフラグはアーカイブの場所を指定します。${logfile##*/}ログファイルのデフォルト名(パスのないファイル名)に拡張されます(で置き換えることができます$(basename "$logfile"))。

毎月初めに、次のコマンドを使用して前月のログファイルアーカイブを圧縮できます。

#!/bin/sh

yyyymm="$( date --date="1 month ago" +"%Y-%m" )"

gzip --best "/data/logs/logfiles-$yyyymm.tar"

自分でやるより少し面倒です

cd /var/log &&
tar -c -z -f /data/logs/logfiles-2016-08.tar.gz *-2016-08-??.log &&
rm *-2016-08-??.log

月に一度ですが、そうする理由があるかもしれません。

tar -r注:以下を使用してアーカイブにファイルを追加できます。圧縮ファイルにすることはできません。当時(GNUはtarおそらくこれをサポートしたでしょう)。アーカイブが存在しない場合は作成されます。また、上記の例ではGNUが必要であることに注意してくださいdate

関連情報