Tar 远程目录,文件上不带前导 ./

Tar 远程目录,文件上不带前导 ./

我有几个运行和收集数据的脚本,然后将这些数据输入到其他脚本中。所以整个链条都是自动化的。在自动化过程中的某一时刻,所有数据文件都会被打包以发送进行处理。我正在使用的命令是这样的:

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一部分(coreutilscoreutil.infocoreutils-5.0https://ftp.gnu.org/gnu/coreutils/),所以早于tar 1.15.1

' -A'
' 列出目录中除 ' ' 和 ' ' 之外--almost-all的所有文件。
...

所以这应该按预期工作(一对括号是为了忘记cd,你可能可以cd -这样做或者只是不关心):

( cd "$data_dir" && ls -A | tar -zchvf "$target_file" -T - ) 

相关内容