防止上层目录被打包到tar文件中

6
基本上,我只想将目录中的所有文件打包成tar文件,但不要在压缩包中包括所有父目录。
我已经尝试过使用-C参数,但我猜我没有正确使用它。
tar -cjf archive.tar.bz2 -C /var/some/log/path ./*

这会导致tar尝试添加当前工作目录中的所有文件。将完整路径作为最后一个参数并不能防止目录被添加。

看起来很简单,但是我无法理解。不知何故,tar没有将"./"视为相对于“-C”而改变到该目录。

需要帮助。


这是 shell 将 ./* 展开为文件名列表,而 tar 只能看到这个文件名列表。 - Gilles 'SO- stop being evil'
2个回答

11

父目录(/var/some/log)也被包括在内,因为当你执行./*时,/var/some/log/path/..也会被包括在内。尝试只执行

tar -cjf archive.tar.bz2 -C /var/some/log/path .

测试运行:

$ find tmp/some_files
tmp/some_files
tmp/some_files/dir1
tmp/some_files/dir1/dir1file
tmp/some_files/hello
tmp/some_files/world
tmp/some_files/dir2
tmp/some_files/dir2/dir2file
$ tar -cvjf archive.tar.bz2 -C tmp/some_files/ .
./
./dir1/
./dir1/dir1file
./hello
./world
./dir2/
./dir2/dir2file
$ cd tmp/unpacked
/tmp/unpacked$ mv /home/aioobe/archive.tar.bz2 .
/tmp/unpacked$ tar -xvjf archive.tar.bz2 
./
./dir1/
./dir1/dir1file
./hello
./world
./dir2/
./dir2/dir2file
/tmp/unpacked$ ls
archive.tar.bz2  dir1  dir2  hello  world
/tmp/unpacked$ 

这有所改善,但现在它在tar中添加了“.”作为父目录。我只想要文件。 - Joe
不,"./"前缀只是一种符号表示法。它包含存档文件的“根”中的文件。 - aioobe
为了避免在根目录中显示“.”(例如在文件压缩器中),您可以执行以下操作: tar -cjf archive.tar.bz2 -C /var/some/log/ path/ 然后,最新的元素“path”将在根目录中显示。解释:-C表示“切换到此目录”,并且最后一个参数“tar该目录”。 - Kristjan Adojaan
@aioobe "./"前缀不一定是符号。在我的机器上,我得到一个名为“。”的文件夹作为上面示例中的父文件夹,而如果我更改目录然后进行tar操作,“./”就会消失,我只剩下存档根目录中的所有文件。 - tudor -Reinstate Monica-

0

有一种更简单的方法来完成这个操作:

  1. cd 到你想要作为顶级目录的文件夹,例如...

    cd /var/lib/mysql

  2. 从你的 tar 命令中删除父目录

    /var/lib/mysql/DATABASE_NAME 变成了 DATABASE_NAME

更多细节可以在 这篇博客文章 中找到。


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