Linux 命名tar存档与源文件相同

Linux 命名tar存档与源文件相同,linux,tar,Linux,Tar,简单地说,我想从一个文件创建一个存档并保留文件名 File = host1.log Tar = Archive_date_host1.tar.gz 我是这样使用它的: find /var/log/TESTIN/ -daystart -mtime 7 -type f | xargs tar -czPf /var/log/TESTOUT/ARCHIVE_$(date +%F)_FILENAMEHERE.tar.gz “归档”和日期部分我可以做,但有没有办法抓取文件名并使用它?我在谷歌上搜索了很

简单地说,我想从一个文件创建一个存档并保留文件名

File = host1.log
Tar  = Archive_date_host1.tar.gz
我是这样使用它的:

find /var/log/TESTIN/ -daystart -mtime 7 -type f | xargs tar -czPf /var/log/TESTOUT/ARCHIVE_$(date +%F)_FILENAMEHERE.tar.gz

“归档”和日期部分我可以做,但有没有办法抓取文件名并使用它?我在谷歌上搜索了很多东西,但似乎什么也找不到。

我认为只要
查找就足够了。例如,下面的命令将使用您想要的命名方案找到的每个文件创建一个
.tar.gz
存档。注意,
{}
被找到的文件名替换

find * -type f -exec tar -czf ARCHIVE_$(date +%F)_{}.tar.gz {} \;

看起来您希望使用每个文件的名称作为输出文件的变量部分,即删除名称的目录部分和
.log
后缀。试试这个:

find /var/log/TESTIN/ -daystart -mtime 7 -type f | \
xargs -I {} sh -c 'tar -czPf /var/log/TESTOUT/ARCHIVE_$(date +%F)_$(basename {} .log).tar.gz {}'

这里的关键是使用
-exec
,它允许您访问
查找
找到的每一件东西。这非常有效。只是一个简单的后续问题。我还没有用过xargs,所以我还在学习。sh-c的具体功能是什么?sh-c命令将字符串作为参数,并将其作为shell命令运行,执行所有常规操作,例如命令替换(
$(…)
)。xargs可以运行任何单个命令,但它不一定要使用shell来运行,而尝试嵌套命令—要求xargs运行
basename{}
,并使用其输出来构成
tar
命令的一部分—仅使用xargs可能会有点混乱;让一个外壳来做这件事比较容易。