如何在 tar 命令中排除绝对路径?

40

我正在运行一个PHP脚本,让我得到我想打包的文件的绝对路径。这是我所拥有的语法:

tar -cf tarname.tar -C /www/path/path/file1.txt /www/path/path2/path3/file2.xls
当我解压缩文件时,它会创建到文件的绝对路径。如何只获取 /path 并显示其中的所有内容?
4个回答

53

如果你想要删除文件名的前n个组件,需要使用strip-components。所以在你的情况下,在提取时,执行以下操作:

strip-components 是用来去掉路径中前几个组件的选项。
tar xvf tarname.tar --strip-components=2

man页面列出了tar的许多选项,包括这个。一些早期版本的tar使用--strip-path代替此操作。


53

您错误地使用了-C开关,该开关用于更改目录。因此,您需要执行以下操作:

tar -cf tarname.tar -C /www/path path/file1.txt path2/path3/file2.xls

或者,如果您想将所有内容打包到/www/path下,请执行以下操作:

tar -cf tarname.tar -C /www/path .
你可以多次使用-C开关。

4
当我尝试这样做时,我的归档文件中会加入一个名为"dot"的文件。命令为"tar -cf tarname.tar some_file_in_current_folder -C /some/path ." - Kevin Thompson
尝试运行 tar -tvf tarname.tar 命令,你会发现这不是一个文件。 - Johnny Baloney

12

对我来说,以下方法最有效:

tar xvf some.tar --transform 's?.*/??g'

--transform 参数是 sed 的替换正则表达式,它将接收每个提取的文件路径。与 --strip-components 不同,它会移除所有路径信息,而不仅仅是固定数量的组件。

--transform 参数是一个替换正则表达式,用于处理每个提取出的文件路径。与 --strip-components 不同,它会移除所有路径信息,而不仅仅是固定数量的组件。


2
请注意,长名称选项--transform仅适用于GNU tar。BSD tar的等效选项是-s,后跟/old/new/[gps]模式。使用这种方式,正如你所说,它会扁平化目录结构,但在实际应用中可能没��太大用处。 - Meow
1
当你不知道兔子洞有多深(我是说你的目录结构)时,最好的选择是确保所有文件名在目录中都是唯一的,否则你可能会遇到意外的结果。 - trs

2
如果您不知道路径中有多少组件,可以尝试以下方法:
DIR_TO_PACK=/www/path/
cd $DIR_TO_PACK/..
tar -cf tarname.tar $(basename $DIR_TO_PACK)

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