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

Unix 将最后n行文件添加到tar/zip,unix,shell,zip,tar,Unix,Shell,Zip,Tar,我需要定期发送一组日志文件,这些文件可能会变得很大,所以我只想发送每个文件的最后n行 例如: /usr/local/data_store1/file.txt (500 lines) /usr/local/data_store2/file.txt (800 lines) 给定一个名为files.txt的包含所需文件列表的文件,我想创建一个包含每个文件最后100行的存档(tar或zip) 我可以通过创建一个带有尾部文件的单独目录结构来实现这一点,但这似乎是在浪费资源,因为可能需要一些管道魔法来实现

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

例如:

/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.的Solaris机器。)

您可以尝试

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中

您的接收者在其计算机上创建一个存储库,通过签出从中检索文件


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

没有管道魔法,你必须创建你想要的文件夹结构并压缩它

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守护进程,要设置无密码自动传输,只需使用公钥身份验证。

是。考虑到cvs或svn已经安装,这非常容易实现和使用。这绝对是一个有趣的解决方案,但并不适用于这种情况。我需要对日志进行加焦油处理,以便偶尔发送给外部支持机构。我也不想发送庞大的日志,只想在发生错误时发送最后几行。