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

如何使用linux重命名放入tar存档的文件;焦油';,linux,tar,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 t

我正在尝试创建一个包含几个文件的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/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
作为
foo
添加到
file.tar

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

您可以多次使用
--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
,无需先创建临时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
标志对于防止转换破坏存档中的任何符号链接目标(也与^匹配)至关重要。

在不喜欢我找到的任何解决方案之后,我刚刚编写了一篇文章,它允许您为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
输入,只使用输出路径作为输入,无需重命名)

我们可以参考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=…
。也请阅读文档,以便更好地了解其工作原理(尤其是转换标志的工作原理)。如果搜索表达式是一个变量,并且应该按字面处理,该怎么办?不过,这只是用于提取。