创建并重命名目录的tar命令

3

我有一个名为dir的目录,其中包含文件file1file2file3,我想从中创建一个名为dir.tar.gz的gzipped tar目录,但层次结构应为:

anotherdir/file1
anotherdir/file2
anotherdir/file3

总有一种方法可以编写一个 shell 脚本将 dir 重命名为 anotherdir,然后再打包它,但我希望有更加优雅的解决方案。

3个回答

3

使用符号链接并在打包时解除引用。

$ mkdir dir && touch dir/file{1,2,3} && ln -sf dir anotherdir
$ tar -hcvpf a.tar anotherdir
anotherdir/
anotherdir/file1
anotherdir/file2
anotherdir/file3
$ tar -tf a.tar 
anotherdir/
anotherdir/file1
anotherdir/file2
anotherdir/file3

问题在于我的设置不是典型的,而且目录anotherdir已经存在。难道没有其他办法吗? - kaykun
anotherdir 可以在任何目录中。先 cd/tmp,然后创建符号链接。 - kojiro

1

以下代码似乎可以正常工作。Tar 不会跟随链接,但生成的 tar 文件将为文件添加额外的 ./(我认为这并不是什么大问题)。

mkdir dir another_dir && touch dir/file{1,2,3} another_dir/another_file{1,2,3}

tmp_dir=`mktemp -d /tmp/dXXXX` && ln -s `pwd`/dir $tmp_dir/another_dir && 
    tar -C $tmp_dir -cvf result.tar another_dir/. &&
    rm $tmp_dir/another_dir && rmdir $tmp_dir

1

你可以创建一个符号链接,然后强制tar跟随它:

ln -s dir anotherdir
tar -czf dir.tar.gz -L anotherdir

请注意,这也将跟随树内的任何符号链接。


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