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 '{}' \+

おすすめ記事