如何创建平面tar归档文件

14

我的 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

?


1
mkdir archive; find t/ -name *.ps -exec ln {} archive/ ; ; (cd archive && tar zcf ../ps.tar.gz *.ps); rm -rf archive - sastanin
2个回答

13

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

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

1
可以通过与http://serverfault.com/a/566345/343194的组合来实现多个目录的更好结果。类似于`find ./commondir -type f | tar --transform 's/.*///g' -cvzf ./file.tar.gz --files-from=/dev/stdin`。这样,空的子目录将被排除在外。 - nikolay_turpitko

6
outfile=$(pwd)/ps.tar;find . -type f | while read file; do 
    tar rf $outfile -C $(dirname $file) $(basename $file)
done
gzip $outfile

1
如果你想将上述操作写成一行代码:find . -type f -exec bash -c "archive=./ps.tar.gz;fname=`basename {}`;fdir=`dirname {}`;tar cfz $archive -C $fdir $fname" ; - Qben
@Qben 应该使用 tar rf 来追加到归档文件中。
a) 使用 tar cf 会用最后几个文件覆盖输出文件。
b) 虽然无法在压缩模式下追加,但需要对输出的 tar 文件进行 gzip 处理。
- GuruM
漂亮的脚本加1分。 没有注意到$(basename $file)部分与-C选项一起使用以帮助压缩文件的平铺。 - GuruM
上面的脚本在处理文件/目录名称中的空格时存在问题。需要转义这些空格。 - GuruM
使用fname="${file##/}"和fdir="${file%/}"可以减少需要外壳的次数。 - GuruM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接