tar – 提取丢弃的目录结构

Ben*_*XVI 39 unix zip tar archiving

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

有没有办法tar以同样的方式工作?手册页中似乎没有任何内容表明如此。

那么,有没有替代的工具,最好是自由软件,可以做到这一点?

mar*_*rio 91

GNU tar 依赖于 featuritis,所以自然也有一些选择。
http://www.gnu.org/software/tar/manual/html_node/transform.html

如果您只想删除几个路径段,那么--strip-components=nor--strip=n经常会这样做:

 tar xvzf tgz --strip=1
Run Code Online (Sandbox Code Playgroud)

但是也可以使用正则表达式重写要提取的文件(标志是--transformor--xform并接受带有/x修饰符的ereg ):

 tar xvzf tgz --xform='s#^[^/]+#.#x'
                 # or 's#^.+/##x' for discarding all paths
Run Code Online (Sandbox Code Playgroud)

要列出 tar,您需要附加--show-transformed选项:

 tar tvzf tgz --show-transformed --strip=1 --xform='s/abc/xyz/x'
Run Code Online (Sandbox Code Playgroud)

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

  • 为什么不是`s#.*/##`? (4认同)
  • --strip刚刚让我开心。谢谢! (3认同)
  • 比公认的答案要好得多。 (3认同)

Mik*_*eyB 13

您可以通过两个步骤轻松完成。根据需要进行调整:

$ mkdir /tmp/dirtree
$ tar xfz /path/to/archive -C /tmp/dirtree
$ find /tmp/dirtree -type f -exec mv -i {} . \;
$ rm -rf /tmp/dirtree
Run Code Online (Sandbox Code Playgroud)


hfs*_*hfs 8

pax 可以做到:

pax -v -r -s '/.*\///p' < archive.tar
Run Code Online (Sandbox Code Playgroud)

或者

zcat archive.tar.gz | pax -v -r -s '/.*\///p'
Run Code Online (Sandbox Code Playgroud)

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