如何使用linux'tar'将文件重命名为tar档案

我试图用一些文件创build一个tar档案,但重命名档案中的这些文件。 现在我有这样的东西:

tar -czvf file1 /some/path/to/file2 file3 etc 

但我想要做一些事情:

 tar -czvf file1=file1 /some/path/to/file2=file2 file3=path/to/renamedFile3 etc=etc 

在提取到目录testDir的时候,你会看到这些文件:

  • TESTDIR /文件1
  • TESTDIR /文件2
  • TESTDIR /path/到/ renamedFile3
  • TESTDIR的/ etc

我怎样才能做到这一点?

您可以使用--transform修改文件名(等等)。 例如,要创建磁带归档文件/tmp/foo.tar ,将文件/etc/profile/etc/bash.bashrc放入其中,同时将profile重命名为foo ,则可以执行以下操作:

 tar --transform='flags=r;s|bar|foo|' -cf file.tar file1 file2 bar fubar /dir/* 

上面的结果是bar被添加到file.tar作为foo

r标志表示转换仅应用于常规文件。 有关更多信息,请参阅GNU tar文档 。

您可以使用--transform多次转换,例如:

 tar --transform='flags=r;s|foo|bar|' --transform='flags=r;s|baz|woz|' -cf file.tar /some/dir/where/foo/is /some/dir/where/baz/is /other/stuff/* /dir/too 

我们可以参考man tar-O选项是最好的选择,因为文件可以写成标准输出。

 -O (x, t modes only) In extract (-x) mode, files will be written to standard out rather than being extracted to disk. In list (-t) mode, the file listing will be written to stderr rather than the usual stdout. 

这里是例子:

 # 1. without -O tar xzf 20170511162930.db.tar.gz # result: 20170511162930.db # 2. with -O tar xzf 20170511162930.db.tar.gz -O > latest.db # result: latest.db 

--transform ,不需要先做一个临时的testDir。 要将testDir/加到档案中的所有内容中,请匹配起始锚点^:

 tar --transform "s|file3|path/to/renamedFile3|" \ --transform "flags=r;s|^|testDir/|" \ -czvf my_archive.tgz file1 /some/path/to/file2 file3 etc 

r标志对于保持转换不会破坏存档中的任何符号链接目标(这也符合^)至关重要。

在不喜欢我找到的任何解决方案后,我刚刚编写了tarlogs.py ,它允许您为tar条目指定任意名称。 每个tar条目由一个(或几个)常规(或gzip)输入构成。 您也可以添加目录,这些目录将像常规tar一样被递归。 所以在你的情况下,

 tarlogs.py -o file1 -i /some/path/to/file2 -o file2 -i file3 -o path/to/renamedFile3 -o /etc >output.tar 

-o没有-i输入只是简单地使用输出路径作为输入,而没有重命名)