web-dev-qa-db-ja.com

paxアーカイバを使用して現在のディレクトリ以外のディレクトリに抽出する

私はここのpaxアーカイバで奇妙な振る舞いをしていて、tarであまりにも多くの問題を抱えていました、そしてそれは絶対的な道です、それで私はpaxにショットを与えました。以下のワンライナーは、暗号化されたアーカイブを抽出するためにFreeBSD9.2で使用されます。基本的には非常にうまく機能しますが、アーカイブを作業ディレクトリ以外のパスに抽出しようとすると、次のエラーメッセージが表示されます。

WARNING! These patterns were not matched:
/home/myuser/testing

例:

    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

その上、/home/myuser/testing/には間違いなく書き込み権限があり、rootとして実行しています。

それは本当に「設計どおりに機能」し、各抽出の前にcd /output/pathする必要がありますか、それとも何か間違ったことをしていますか?

5
royskatt

paxの引数は、アーカイブ内のパスです。別のディレクトリで解凍する場合の通常のイディオムは、解凍するディレクトリに移動することです。

… | { cd / && pax -r -pe; }

別のアプローチは、パスを書き換えるようにpaxに指示することです。これは、いくつかの主要なディレクトリを削除する場合に特に便利です。

… | pax -s '!^/home/myuser!!' -r -pe

はい、最初にcdする必要があります。

ファイル名の引数を指定すると、その引数に一致するファイルのみを抽出するようにpaxに指示します。

POSIX pax docs

読み取りモード(-rが指定されているが、-wが指定されていない場合)では、paxは、指定されたパターンに一致するパス名を使用して、標準入力から読み取られたアーカイブファイルのメンバーを抽出します。

表示されるエラーメッセージ

警告!これらのパターンは一致しませんでした:/ home/myuser/tests

アーカイブにそのディレクトリの下にファイルが含まれていないことを示しています。

6
Mikel

残念ながら、あなたの提案はどれもうまくいきませんでした。動作するものは次のとおりです。

...| pax -rv -s '=^/old/source/dir/=/new/target/dir/='

残っている問題は1つだけです。正規表現でシェル変数を使用できません。回避策は次のとおりです。forループでパイプコマンド全体を動的に作成しますが、それは別の話です...

0
royskatt