私はここの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
する必要がありますか、それとも何か間違ったことをしていますか?
pax
の引数は、アーカイブ内のパスです。別のディレクトリで解凍する場合の通常のイディオムは、解凍するディレクトリに移動することです。
… | { cd / && pax -r -pe; }
別のアプローチは、パスを書き換えるようにpax
に指示することです。これは、いくつかの主要なディレクトリを削除する場合に特に便利です。
… | pax -s '!^/home/myuser!!' -r -pe
はい、最初にcd
する必要があります。
ファイル名の引数を指定すると、その引数に一致するファイルのみを抽出するようにpax
に指示します。
読み取りモード(-rが指定されているが、-wが指定されていない場合)では、paxは、指定されたパターンに一致するパス名を使用して、標準入力から読み取られたアーカイブファイルのメンバーを抽出します。
表示されるエラーメッセージ
警告!これらのパターンは一致しませんでした:/ home/myuser/tests
アーカイブにそのディレクトリの下にファイルが含まれていないことを示しています。
残念ながら、あなたの提案はどれもうまくいきませんでした。動作するものは次のとおりです。
...| pax -rv -s '=^/old/source/dir/=/new/target/dir/='
残っている問題は1つだけです。正規表現でシェル変数を使用できません。回避策は次のとおりです。forループでパイプコマンド全体を動的に作成しますが、それは別の話です...