【问题标题】:How to create flat tar archive如何创建平面 tar 存档
【发布时间】:2011-02-04 12:38:07
【问题描述】:

我的tree 命令返回

tmp
`-- t
    `-- e
        |-- foo.ps
        `-- s
            |-- bar.ps
            `-- t
                `-- baz.ps

如何在 tmp 目录中创建归档 ps.tar.gz,结构如下:

tmp
|-- ps.tar.gz
|   |-- foo.ps
|   |-- bar.ps
|   `-- baz.ps
`-- t
    `-- e
        |-- foo.ps
        `-- s
            |-- bar.ps
            `-- t
                `-- baz.ps

?

【问题讨论】:

  • mkdir 存档;查找 t/ -name *.ps -exec ln {} 存档/ \; ; (cd archive && tar zcf ../ps.tar.gz *.ps); rm -rf 存档

标签: gzip tar


【解决方案1】:

对于 GNU tar,您可以使用 --xform 参数。它采用sed 表达式并将其应用于每个文件名。因此,要删除直到最后一个 / 的所有字符,您可以使用:

tar -c --xform s:^.*/:: your-files

【讨论】:

  • serverfault.com/a/566345/343194结合可以实现多个目录的更好结果。像find ./commondir -type f | tar --transform 's/.*\///g' -cvzf ./file.tar.gz --files-from=/dev/stdin 这样的东西。这样会排除空的子目录。
【解决方案2】:
outfile=$(pwd)/ps.tar;find . -type f | while read file; do 
    tar rf $outfile -C $(dirname $file) $(basename $file)
done
gzip $outfile

【讨论】:

  • 如果你喜欢在 oneliner 中执行上述操作:查找 . -type f -exec bash -c "archive=./ps.tar.gz;fname=`basename {}`;fdir=`dirname {}`;tar cfz \$archive -C \$fdir \$fname" \ ;
  • @Qben 应该是 tar rf 以附加到存档。 a) 使用tar cf 将用最后几个文件覆盖输出文件。 b)虽然不能以压缩模式附加。所以需要对输出的tar文件做一个gzip。
  • +1 以获得简洁的脚本。没有注意到 $(basename $file) 部分与 -C 选项一起用于帮助展平 tar 文件。
  • 上述脚本在处理文件/目录名称中的空格时存在问题。需要避开空格。
  • 使用 fname="${file##*/}" 和 fdir="${file%/*}" 减少了脱壳的需要。
猜你喜欢
  • 2017-04-20
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
  • 1970-01-01
  • 1970-01-01
  • 2012-04-30
  • 1970-01-01
相关资源
最近更新 更多