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

问题描述:

我需要定期发送一个日志文件的集合,这个日志文件的集合可以增长得相当大,所以我只想发送每个文件的最后一行n将最后n行文件添加到tar/zip中

例如:

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

鉴于名为files.txt所需的文件列表的文件,我想用最后100行,每行这些文件的创建存档(tar或zip)。

我可以通过创建尾版文件在不同的目录结构做到这一点,但是这似乎是一种资源的浪费时可能有一些神奇的管道,可以发生来完成它。完整的目录结构也必须保留,因为文件可以在不同的目录中具有相同的名称。

我希望解决方案是可能的shell脚本,但perl(无需添加模块)也是可以接受的(这对于没有安装ruby/python/etc的Solairs机器)。

你可以尝试

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 -- 

包tar.gz

为什么不把你的日志文件放在SCM中?

您的接收器在他的机器上创建一个存储库,从他检索文件的位置检出文件。

您只需提交文件即可发送文件。只有diff会被传送。

+0

这是极端的矫枉过正。 – hendry 2009-02-05 20:01:55

没有管道魔术,你必须创建你想和压缩的文件夹结构。

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/* 

使用logrotate

查看/etc/logrotate.d的例子。

您正在专注于特定的实现,而不是看大图。

如果最终目标是在最小化传输数据量的同时在目标机器上准确复制文件,那么应该使用的是rsync,它只会自动发送已更改文件的部分,接收时可以在发送和解压缩时自动压缩。

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