tar抽出はファイル名に依存しますか?


33

sourceforge.netからwgetでtarballをダウンロードすることがよくあります。

ダウンロードされたファイルには、たとえば SQliteManager-1.2.4.tar.gz?r=http:%2F%2Fsourceforge.net%2Fprojects%2Fsqlitemanager%2Ffiles%2F&ts=1305711521&use_mirror=switch

しようとすると

tar xzf SQliteManager-1.2.4.tar.gz\?r\=http\:%2F%2Fsourceforge.net%2Fprojects%2Fsqlitemanager%2Ffiles%2F\&ts\=1305711521\&use_mirror\=switch

次のエラーメッセージが表示されます。

tar (child): Cannot connect to SQliteManager-1.2.4.tar.gz?r=http: resolve failed

gzip: stdin: unexpected end of file
tar: Child returned status 128
tar: Error is not recoverable: exiting now

ファイルの名前をfoo.tar.gz抽出に変更すると、完璧に機能します。

ターゲットファイルを抽出する前に毎回名前を変更することを強制されない方法はありますか?

回答:


50

表示されているエラーの理由は、GNU tarドキュメントに記載されています

アーカイブファイル名にコロン( ':')が含まれている場合、別のマシン上のファイルであると見なされます[...]

つまりSQliteManager-1.2.4.tar.gz?r=http、ホスト名として解釈し、IPアドレスに解決しようとしているため、「resolve failed」エラーが発生します。

同じドキュメントは次のように言っています:

名前にコロンが含まれるファイルを使用する必要がある場合は、「-force-local」オプションを使用してリモートテープドライブの動作を禁止できます。


...の--force-local前に追加する必要があることに注意してくださいf...私がこれを最初に試したとき、そのようなファイルがないというエラーメッセージが表示されていました--force-local。たぶん、これはあまりにも「当たり前」ではないかもしれませんが、私は5分後まで私が犯した間違いを認識しませんでした。
ArtOfWarfare

@ArtOfWarfare:ftarfileである引数を取ります。あなたは置くことができない--force-localf、その引数が、それだけではなく、すべてのプログラムのための標準であるtarだけでなく-f。の引数の後でもある限り、--force-local後に置くことができfますf
CAMH

私がコメントで言ったように、多分それはあまりにも「当たり前」ではありません。私はこのようなtarを使用しtar -cvzf ...ますが、各フラグが実際に99%の時間を実際に実行することについても考えていません。
ArtOfWarfare

このノートでは、これら2つ(@ArtOfWarfareと@camhが)ここで言っていることで、より有用であることは例である: tar zxvf C:\Users\jdoe\Documents\tarfile.tgz --force-local
博士ダン

6

でダウンロードする場合wget-Oオプションで出力ファイル名を指定します。

wget "http://domain.com/file.tgz?crazy=args&stuff=todelete" -O file.tgz

これにより、ファイルは指定されたファイル名で保存され、トラブルや名前の変更が保存されます。また、sourcefourgeがurlパラメータが付加されたファイルを渡すほど愚かなことを望まないのはあなただけではありません。


これは、SourceForgeののせいではありませんが、wget「S。この--content-dispositionフラグを使用して、サーバー指定のファイル名で保存します(ただし、SourceForgeは任意のファイル名に書き込むことができるため、セキュリティへの影響に注意してください)。
pcworld

4

を使用してダウンロード

wget --trust-server-names URL

これにより、wgetは正しいファイル名で保存します。デフォルトでは、URLの最後のコンポーネントを使用します

例えば

wget --trust-server-names http://sourceforge.net/projects/sqlitemanager/files/sqlitemanager/1.2.4/SQliteManager-1.2.4.tar.gz/download

4

上記で引用したように、:(列)tarはリモートファイルであると見なします。したがって、ローカルであるという事実を強制する必要があります。

失敗します

$ tar czf "back$(date -u +"%H:%M").tar.gz" ./
tar (child): Cannot connect to back10: resolve failed
tar: Child returned status 128
tar: Error is not recoverable: exiting now

溶液

./(現在のディレクトリ)を正しく追加して引用することにより、ローカルファイルであることを明示します。

$ tar czf ./"back$(date -u +'%H:%M').tar.gz" ./
tar: .: file changed as we read it

この警告は、ソースディレクトリに作成しているためです。


長いフラグを使用するよりもはるかに優れています。また、この目的を達成するための特定のツールがありますが、リモートホストのダウンロードは役に立たないオプションだと思います。
アリレザモハマディ

3

既にダウンロードされたファイルの場合、これは機能するはずです:

tar xzf - < SQliteManager-1.2.4.tar.gz*
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.