在自动化工作结束时,我想打包一些日志文件并将它们存放在某个地方,以备需要分析时使用。日志文件位于主机上的多个不同位置,其中一些可能非常大。
假设存在以下文件并且我想要所有这些文件:
/app/app_stderr.log
/app/app_stdout.log
/var/log/service/service.log
/var/lib/service/service_backend.log
/var/log/messages.log
但是我不想要 tar 文件中的任何路径。我只想要这五个文件:
app_stderr.log
app_stdout.log
service.log
service_backend.log
messages.log
我还想要 gzip 压缩的 tar 存档。理想情况下,我希望以最有效的方式执行此操作 - 即不必在 gzip 压缩之前复制日志文件或临时存储未压缩的 tar 文件。
通常作为类似问题的解决方案-C
给出的选项不适用于我,因为我想从多种的文件系统不同部分的目录,同时仍然删除路径名。
如果我只是跑:
tar -czf /drop/run_logs.tar.gz /app/app_*.log /var/log/service/*.log /var/lib/service/*.log /var/log/messages.log
然后我将获得一个包含路径的 tar 文件。
可以完成剥离路径吗?
答案1
tar--transform
选项允许您在写入 tar 文件之前修改文件名。此选项将在将文件名sed
写入 tar 文件之前通过表达式运行文件名。看这里了解完整详情。
这是一个简单的例子。
首先创建几个文件添加到 tar 文件中
$ mkdir test-tar
$ cd test-tar
$ mkdir -p alpha/beta/gamma
$ touch alpha/one.log
$ touch alpha/beta/two.log
$ touch alpha/beta/gamma/three.log
使用标准tar
来重现具有完整相对路径的 tar 文件。
$ tar cf test.tar alpha/*.log alpha/beta/*.log alpha/beta/gamma/*.log
$ tar tf test.tar
alpha/one.log
alpha/beta/two.log
alpha/beta/gamma/three.log
现在重做该命令但使用该--transform
选项。在示例中,我使用 sed 表达式s#.*/##
删除文件名中直到最右边的所有前导字符/
。
$ tar cf test-transform.tar alpha/*.log alpha/beta/*.log alpha/beta/gamma/*.log --transform='s#.*/##'
现在查看 tar 文件中写入的内容
$ tar tf test-transform.tar
one.log
two.log
three.log
不存在引导路径。