我有一个名为dir
的目录,其中包含文件file1
、file2
和file3
,我想从中创建一个名为dir.tar.gz
的gzipped tar目录,但层次结构应为:
anotherdir/file1
anotherdir/file2
anotherdir/file3
总有一种方法可以编写一个 shell 脚本将 dir
重命名为 anotherdir
,然后再打包它,但我希望有更加优雅的解决方案。
使用符号链接并在打包时解除引用。
$ 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
以下代码似乎可以正常工作。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
你可以创建一个符号链接,然后强制tar
跟随它:
ln -s dir anotherdir
tar -czf dir.tar.gz -L anotherdir
请注意,这也将跟随树内的任何符号链接。
anotherdir
可以在任何目录中。先cd
到/tmp
,然后创建符号链接。 - kojiro