tar –提取丢弃目录结构


34

unzip具有一个漂亮的选项-j,借此将归档的目录结构丢弃,并将所有文件提取到同一目录中。

有没有办法tar以相同的方式进行工作?手册页中似乎没有任何内容表明这一点。

那么,是否有替代工具(最好是免费软件)可以做到这一点?


Answers:


79

GNU焦油依赖于胎儿炎,因此自然也有一些选择。
http://www.gnu.org/software/tar/manual/html_node/transform.html

如果你只是想删除一些路径段,然后--strip-components=n还是--strip=n会经常做的事:

 tar xvzf tgz --strip=1

但是也可以对要提取的文件进行正则表达式重写(标记是--transformor,--xform并使用/xmodifer 接受ereg ):

 tar xvzf tgz --xform='s#^[^/]+#.#x'
                 # or 's#^.+/##x' for discarding all paths

要列出tar,您需要其他--show-transformed选项:

 tar tvzf tgz --show-transformed --strip=1 --xform='s/abc/xyz/x'

我相信重写选项还可以用于打包,而不仅仅是提取。但是pax显然有更好的语法。


4
为什么不s#.*/##呢?
l0b0 2012年

3
--strip让我开心。谢谢!
SamStephens

--strip在os x tar手册页中未提及,但是仍然可以运行,谢谢!
SLF

3
比公认的答案好得多。
卡拉图·冯·施拉克

--strip和之间有什么区别--strip-components
Joel Berkeley

13

您可以分两步轻松完成此操作。根据需要进行调整:

$ mkdir /tmp/dirtree
$ tar xfz /path/to/archive -C /tmp/dirtree
$ find /tmp/dirtree -type f -exec mv -i {} . \;
$ rm -rf /tmp/dirtree

这就是我的方法(使用find -exec mv -i而不是find | xargs)。...我可以在任何系统上重复执行这些简单步骤,而无需携带脚本为我做。
魁北克吉ote德09年

1
+1,tmpdir=$( mktemp -d )在创建临时目录时非常方便
sorki 2013年

8

pax 可以做到:

pax -v -r -s '/.*\///p' < archive.tar

要么

zcat archive.tar.gz | pax -v -r -s '/.*\///p'

您可以通过省略该-r选项来首先检查名称替换操作。


1

可能不需要安装任何东西的解决方案。

  1. 使用tar tvf来从tarball抓取所有文件
  2. 分别提取这些文件-将tar提取到stdout并重定向到$ filename

    tar -tvf $1 | grep -v "^d" | \
                  awk '{for(i=6;i<NF+1;i++) {printf "%s ",$i};print ""}' |\
                  while read filename
                  do
                     tar -O -xf $1 "$filename" > `basename "$filename"`
                  done
    

保存为extract.sh并运行为extract.sh myfile.tar。它还会覆盖从压缩包中拉出的目录中遇到的所有重复文件名。


实际上,我只是在家里的某个目录树上对其进行了测试,并且在包含空格的文件上失败了。我将查看是否无法发布更新。
DaveParillo

修复了它,但它并不像以前那么漂亮。
DaveParillo

-1
tar xf foo.tar.gz foo/path/to/file/bar.mp3 -O > bar.mp3

-O选项提取文件以将其标准化,然后>将输出重定向到文件中。因此,在我的示例中,我提取foo.mp3并将其重定向到bar.mp3中。文件名是任意的。

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.