如何从多个路径打包文件而不包含路径名?

如何从多个路径打包文件而不包含路径名?

在自动化工作结束时,我想打包一些日志文件并将它们存放在某个地方,以备需要分析时使用。日志文件位于主机上的多个不同位置,其中一些可能非常大。

假设存在以下文件并且我想要所有这些文件:

/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

不存在引导路径。

相关内容