手册页指出
-C directory
In c and r mode, this changes the directory before adding the following files.
但是,tar 并没有转到我指定的目录,而是报告
tar: <folder name>: Cannot stat: No such file or directory
对于目录中的每个文件夹,我都运行 tar 命令。
我真的需要做这样的事情吗
cd <folder> && tar ... && cd -
或者有办法完成这项工作吗?
答案1
我认为你不能-C
在这个问题中使用你所假设的选项。
部分6.10.1 Changing the Working Directory
在 GNU 手册中tar
描述了-C
这样的选项,
要在文件名列表中间更改工作目录,无论是在命令行上还是在使用“--files-from”(“-T”)指定的文件中,请使用“--directory”(“-C”)。这会将工作目录更改为列表中该点之后的指定目录。
‘--directory=directory’
‘-C directory’
在命令行中间更改工作目录。
例如,
$ tar -c -f jams.tar grape prune -C food cherry
会将当前目录中的文件“grape”和“prune”放入档案“jams.tar”,然后是目录“food”中的文件“cherry”。当您有几个相距很远的文件想要存储在同一个档案中时,此选项特别有用。
请注意,文件“cherry”在档案中以精确名称“cherry”记录,而不是“food/cherry”。因此,档案将包含三个文件,它们似乎都来自同一目录;如果使用简单的“tar --extract”提取档案,则所有三个文件都将写入当前目录中。
手册页上还有其他一些示例...
更新:
我通常不会将来自不同路径的文件混合到一个 tar-ball 中。
但是,如果您希望如此,可以做两件事,
- 使用
-T
带有要打包在一起的目录/文件列表的选项。
这将收集所有内容以及额外的路径前缀。 - 使用
-h
“链接图像”目录上的选项
(您可以使用脚本创建其中一个目录,以在新的空目录下创建指向感兴趣的文件和目录的链接)在这样的目录上使用的
选项-h
将创建一个代表该目录下文件布局的单个 tar-ball。
答案2
就我个人而言,我更喜欢使用子 shell 来获取柏油进入“位置”。我从未学过这个-C
选项,所以不确定它是如何工作的。
假设我的慢性疾病是/路径/a,我想创建一个/路径/b/foo没有领先的/路径/b:
user@host:/path/a$ ( cd /path/b && tar czf ~/tarball.tgz foo )
user@host:/path/a$
生成的 tarball 包含目录foo/及其所有内容,但不包括主要内容/路径/b. 子 shell 执行光盘,然后柏油如果光盘成功,然后退出到同一个 CWD 中的原始 shell。
答案3
tar -C 不能使用通配符,因为正如 Henno 在其中一条评论中所述:
* 将根据当前目录由 shell 进行扩展,然后再交给 tar
因此,如果您尝试做类似的事情:
tar -cvzf myfile.tgz -C somepath *
这不起作用。据我所知,你必须先更改目录,就像 quack quixote 建议的那样。