如何使用linux'tar'重命名放入tar存档的文件

时间:2014-02-14 22:46:34

标签: linux tar

我尝试使用几个文件创建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 / file1的
  • TESTDIR / file2的
  • TESTDIR /路径/到/ renamedFile3
  • TESTDIR /等

我该怎么做?

4 个答案:

答案 0 :(得分:20)

您可以使用--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 documentation

您可以多次使用--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

答案 1 :(得分:5)

使用--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标志对于保持转换不会破坏归档中的任何符号链接目标(也与^匹配)至关重要。

答案 2 :(得分:2)

我们可以引用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

答案 3 :(得分:0)

在不喜欢我找到的任何解决方案之后,我刚刚编写了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输入只使用输出路径作为输入,没有重命名)