【问题标题】:how to rename files you put into a tar archive using linux 'tar'如何使用 linux 'tar' 重命名放入 tar 存档的文件
【发布时间】:2014-03-14 11:48:27
【问题描述】:

我正在尝试创建一个包含几个文件的 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/path/to/renamedFile3
  • testDir/等

我该怎么做?

【问题讨论】:

    标签: linux tar


    【解决方案1】:

    我们可以参考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
    

    【讨论】:

    • 不过,这仅用于提取。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 这绝对适用于重命名一个文件。重命名多个文件怎么样?
        • 其中有多个转换和/或非常聪明的正则表达式。
        • 你能举一个多重变换的例子吗?你只是多次写--transform=...吗?
        • 您可能已经自己想出了这个问题,但编辑了答案以提供一个确切的例子。也请阅读文档,以便更好地了解其工作原理(尤其是转换标志的工作原理)。
        • 如果搜索表达式是变量怎么办,应该按字面处理?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-14
        相关资源
        最近更新 更多