unzip
有一个漂亮的选项-j
,通过该选项,档案的目录结构被丢弃,并且所有文件被提取到同一个目录中。
有没有办法tar
以同样的方式工作?手册页中似乎没有提到这一点。
那么,有没有一种替代的、最好是免费软件的工具可以做到这一点?
答案1
GNU tar 依赖于功能,因此自然也有一些选项。
http://www.gnu.org/software/tar/manual/html_node/transform.html
如果您只想删除一些路径段,那么--strip-components=n
或--strip=n
通常会这样做:
tar xvzf tgz --strip=1
但是也可以用正则表达式重写要提取的文件(标志是--transform
或--xform
并接受带有/x
修饰符的 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
显然语法更好。
答案2
只需两步即可轻松完成。根据需要进行调整:
$ mkdir /tmp/dirtree
$ tar xfz /path/to/archive -C /tmp/dirtree
$ find /tmp/dirtree -type f -exec mv -i {} . \;
$ rm -rf /tmp/dirtree
答案3
pax
可以做到:
pax -v -r -s '/.*\///p' < archive.tar
或者
zcat archive.tar.gz | pax -v -r -s '/.*\///p'
您可以通过省略该选项来首先检查名称替换操作-r
。
答案4
tar xf foo.tar.gz foo/path/to/file/bar.mp3 -O > bar.mp3
该-O
选项将文件提取到标准输出,并将>
该输出重定向到文件。因此,在我的示例中,我提取了 foo.mp3 并将其重定向到 bar.mp3。文件名是任意的。