我有几个运行和收集数据的脚本,然后将这些数据输入到其他脚本中。所以整个链条都是自动化的。在自动化过程中的某一时刻,所有数据文件都会被打包以发送进行处理。我正在使用的命令是这样的:
tar -zchvf "$target_dir" -C "$data_dir" .
其中 target_dir 是我的 tarball 所在的位置,data_dir 是我的数据所在的位置。
现在一切正常;但是,我的 tarball 中的文件如下所示:
./file1
./file2
<etc>
由于这些文件上的前导 ./,后处理脚本变得混乱。它期望它们看起来像这样:
file1
file2
<etc>
我查看了手册页,对于删除 tar 进程中的前导 ./ 来说,没有什么真正让我印象深刻的。我正在考虑做的一件事是将脚本更改为以下内容......
cd $data_dir; tar -zchvf "$target" *; cd -
但这对我来说感觉非常错误,我相信我还缺少其他一些愚蠢的东西。
我使用 bash v3.2.5 只是作为参考。
答案1
如果您使用 gnu tar,您可以在进入 tar 的过程中编辑文件名:
$ mkdir -p a/b
$ cd a
$ tar cf - --transform='s:^./::' . | tar tvf -
drwxr-xr-x 0 2018-07-24 18:18 ./
drwxr-xr-x 0 2018-07-24 18:18 b/
答案2
Readingtar 1.15.1
的文档,发布于 2004-12-21,来自https://www.gnu.org/software/tar/的下载链接及其包含tar.info
以确保:
6.3 从文件中读取名称
[...]--files-from=FILE NAME' `-T FILE NAME' 获取要从文件 FILE NAME 中提取或创建的名称。
如果您将一个破折号作为“
--files-from
”的文件名(即指定“--files-from=-
”或“-T -
”),则将从标准输入读取文件名。
现在,从2003-04-02开始阅读 的ls
一部分(coreutils
coreutil.info
coreutils-5.0
https://ftp.gnu.org/gnu/coreutils/),所以早于tar 1.15.1
:
'
-A
'
' 列出目录中除 ' ' 和 ' ' 之外--almost-all
的所有文件。.
..
所以这应该按预期工作(一对括号是为了忘记cd
,你可能可以cd -
这样做或者只是不关心):
( cd "$data_dir" && ls -A | tar -zchvf "$target_file" -T - )