使用 pax archiver 解压缩到当前目录以外的目录

roy*_*att 5 directory pax

我在这里的 pax 归档器有一个奇怪的行为,tar 有太多麻烦,而且它是绝对路径,这就是我试一试 pax 的原因。下面的 oneliner 用于在 FreeBSD 9.2 下提取加密档案。基本上它工作得很好,但是当尝试将存档解压缩到工作目录以外的其他路径时,我收到错误消息:

WARNING! These patterns were not matched:
/home/myuser/testing
Run Code Online (Sandbox Code Playgroud)

例子:

    cd /home/myuser

    gpg --no-tty --quiet --no-secmem-warning --yes --batch --passphrase-file /home/myuser/keyfile --decrypt /home/myuser/testing/20110426.pax.xz.gpg | unxz | pax -r 
    # SUCCESS                                                                                                                                                 # SUCCESS

    gpg --no-tty --quiet --no-secmem-warning --yes --batch --passphrase-file /home/myuser/keyfile --decrypt /home/myuser/testing/20110426.pax.xz.gpg | unxz | pax -r /home/myuser
    # SUCCESS                                                                                                                                                 # SUCCESS

    gpg --no-tty --quiet --no-secmem-warning --yes --batch --passphrase-file /home/myuser/keyfile --decrypt /home/myuser/testing/20110426.pax.xz.gpg | unxz | pax -r /home/myuser/testing
    # FAILS                                                                                                                                                   # FAILS

    gpg --no-tty --quiet --no-secmem-warning --yes --batch --passphrase-file /home/myuser/keyfile --decrypt /home/myuser/testing/20110426.pax.xz.gpg | unxz | pax -r /home/myuser/testing/
    # FAILS                                                                                                                                                   # FAILS
Run Code Online (Sandbox Code Playgroud)

最重要的是肯定有写权限/home/myuser/testing/,我以root身份执行它。

这真的“按设计工作”cd /output/path吗,我必须在每次提取之前这样做还是做错了什么?

Mik*_*kel 6

是的,你必须cd先。

当您提供文件名参数时,您是在告诉pax仅提取与该参数匹配的文件。

POSIX pax 文档

在读取模式下(当指定 -r 时,但未指定 -w 时),pax 应提取从标准输入读取的存档文件的成员,路径名与指定的模式匹配。

你得到的错误信息

警告!这些模式不匹配:/home/myuser/testing

告诉您您的存档不包含该目录下的任何文件。


Gil*_*il' 3

的参数pax是存档内的路径。如果您想在不同的目录下解压,通常的习惯做法是更改为您要解压的目录。

\n\n
\xe2\x80\xa6 | { cd / && pax -r -pe; }\n
Run Code Online (Sandbox Code Playgroud)\n\n

另一种方法是告诉pax重写路径。当您想要删除一些前导目录时,这特别有用。

\n\n
\xe2\x80\xa6 | pax -s '!^/home/myuser!!' -r -pe\n
Run Code Online (Sandbox Code Playgroud)\n