将最后n行文件添加到tar / zip

时间:2009-02-05 15:52:45

标签: unix shell zip tar

我需要定期发送一组可能会变得非常大的日志文件,所以我只想发送每个文件的最后 n 行。

例如:

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

如果文件中包含名为files.txt的所需文件列表,我想创建一个存档(tar或zip),其中包含每个文件的最后100行。

我可以通过使用尾部文件创建一个单独的目录结构来实现这一点,但这可能会浪费资源,因为可能会有一些管道魔法可以实现它。还必须保留完整的目录结构,因为文件在不同的目录中可以具有相同的名称。

如果可能的话,我希望解决方案是一个shell脚本,但perl(没有添加模块)也是可以接受的(这适用于没有安装ruby / python / etc ..的Solaris机器。)< / p>

5 个答案:

答案 0 :(得分:1)

你可以尝试

tail -n 10 your_file.txt | while read line; do zip /tmp/a.zip $line; done

其中a.zip是zip文件,10是n

tail -n 10 your_file.txt | xargs tar -czvf test.tar.gz --

for tar.gz

答案 1 :(得分:1)

你专注于一个特定的实现,而不是从更大的角度来看。

如果最终目标是在目标计算机上拥有文件的精确副本,同时最大限度地减少传输的数据量,那么您应该使用的是rsync,它只会自动发送已更改的文件部分,也可以在接收时自动压缩发送和解压缩。

运行rsync不需要标准sshd目标机器上的任何守护进程,并且设置没有密码的自动传输只需要使用公钥认证。

答案 2 :(得分: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/*

答案 3 :(得分:0)

使用 logrotate

查看/etc/logrotate.d内部的示例。

答案 4 :(得分:-1)

为什么不将日志文件放在SCM中?

您的接收者在他的机器上创建了一个存储库,通过检查文件来检索文件。

您只需提交文件即可发送文件。只传输差异。