私はこれが基本的な質問であることを知っていますが、助けてください。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
ループが実行されるたびに、tar
putコマンドが実行されます。一つファイル対ファイル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 '{}' \+