创建不包含父目录的tar归档文件


62

我正在尝试为我的脚本创建一个图形程序。

在脚本中,我使用tar创建tar存档。

从图形程序中,我获得了要创建tar存档的文件的全名。

tar -cvf temp.tar /home/username/dir1/dir2/selecteddir 

我的tar归档文件包括home,用户名,dir1,dir2和selecteddir,而我希望tar创建的归档文件仅包括selecteddir。

Answers:


79

您可以使用-C选项tar来完成此操作:

tar -C /home/username/dir1/dir2 -cvf temp.tar selecteddir

从手册页tar

-C directory
         In c and r mode, this changes the directory before adding the following files.  
         In x mode, change directories after opening the archive but before extracting 
         entries from the archive.

您知道我如何将$ path拆分为selecteddir和高达/ home / username / dir1 / dir2的路径,以便可以使用-C选项
吗?

@SujitMaharjan可以dirname用来提取所有内容,直到“ selecteddir”并basename提取“ selecteddir”。尝试使用$ path作为参数的两个命令。
mkc

2
值得补充的是,这对于GNU和BSD Tar均有效。
卢克·埃克斯顿

5
请注意,不能将地球遍历与-C选项一起使用。tar -C /home/username/dir1/dir2 -cvf temp.tar '*.csv'将无法正常工作。
克里斯蒂安·朗

不起作用:tar:selecteddir:无法统计:没有这样的文件或目录
Tribbloid

11

您可以使用两种方法来解决此问题。

我认为第一个比较容易。只需cd直接进入要压缩的目录上方的目录即可。在这种情况下应该是dir2

$ cd /home/username/dir1/dir2/
$ tar -cvf temp.tar selecteddir

第二种方法是使用--transform带有sed表达式并针对文件名运行它的选项。注意:您必须/sed表达式中转义。

$ tar -cvf temp.tar /home/username/dir1/dir2/selecteddir --transform='s/\/home\/username\/dir1\/dir2\///g'

第一种方法是否在末尾需要一个点(。)?我没有试过,得到了:tar: Cowardly refusing to create an empty archive。当我有点时,它会令人讨厌地使根目录包含名为的目录.。因此,接近但不完美。
JW01

1
除了我之前的评论。我解决了我的问题。$ cd /home/username/dir1/dir2/ && tar -cvf temp.tar selecteddir *为我工作。使用星号代替点.。更新:糟糕-尽管我丢失了隐藏文件。
JW01

6

首先,转到工作目录,

cd /your/working/directory/ 

然后使用魔术*:-)

tar -cvf temp.tar *

我正在尝试存档隐藏目录​​,如果我直接添加它们(否),它可以工作,但是当使用*时,它只会将存档的名称添加到存档中……
Ole

1

实际上,我使用Ketan的答案发现了问题

tar -C / home /用户名/ dir1 / dir2 -cvf temp.tar selecteddir

如果只想复制dir2中的所有文件,而只复制所有文件,那么我首先想到:

tar -C / home /用户名/ dir1 / dir2 -cvf temp.tar *

但是,当您不在dir2目录中时,这将引起问题,因为*将tar文件存储在当前目录中。我使用下面的命令解决了这个问题:

 tar -C /home/username/dir1/dir2 -cvf temp.tar ./

6
但是,您的temp.tar归档文件包含.为根文件夹。
Cgrim '18 October
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.