圧縮されたアーカイブから特定のファイルのみを特定のディレクトリに抽出します


151

パスがわかっているZIPファイルから単一のファイルを抽出する必要があります。次のようなコマンドがあります:

unzip -d . myarchive.zip path/to/zipped/file.txt

残念ながら、上記のコマンドは、のファイルへのパス全体を抽出して再作成します./path/to/zipped/file.txt。ファイルを指定されたディレクトリに単純に引き出す方法はありますか?

回答:


130

次の-pオプションを使用して、テキストのみを標準出力に抽出できます。

unzip -p myarchive.zip path/to/zipped/file.txt >file.txt

これにより、メタデータ(日付、アクセス許可など)は抽出されず、ファイルの内容のみが抽出されます。これは、後でファイルを移動する必要がないという利便性のために支払う価格です。

または、アーカイブをディレクトリとしてマウントし、ファイルをコピーするだけです。AVFS

mountavfs
cp -p ~/.avfs"$PWD/myarchive.zip#"/path/to/zipped/file.txt .

またはfuse-zipを使用

mkdir myarchive.d
fuse-zip myarchive.zip myarchive.d
cp -p myarchive.d/path/to/zipped/file.txt .
fusermount -u myarchive.d; rmdir myarchive.d

2
@TK Kocheran:どうしてテストしてみませんか?最初のコマンドをテストしましたが、うまくいきました。
ユーザー不明

1
@TKKocheran:Jarファイルはzipであるため、unzipおよびfuse-zipメソッドは明らかに機能します。AVFSは、ファイル名に基づいて形式を推測し、認識しているため、AVFSメソッドも機能します.jar。ファイルの名前が異なる場合、AVFSにそのzipハンドラーを使用するように指示する必要がある場合があります~/.avfs$PWD/foo.apk#uzip/META-INF
ジル

1
実際には、ZIPアーカイブからJAR /バイナリファイルを抽出することを意味しました。まだテストする機会がありませんが、上記の最初のコマンドを使用してバイナリファイルを抽出する際に問題を確認できますか?
ナフトゥリケイ

2
@TKKocheran:問題ありません。-pファイルをそのまま抽出します(-cテキスト変換を行います)。
ジル

2
@Mylesの答えは、出力のリダイレクトを必要とせず、ファイル属性を保持するため、よりエレガントだと思います。
gertvdijk

152
unzip -j "myarchive.zip" "in/archive/file.txt" -d "/path/to/unzip/to"

ファイル名だけでなく、zipファイルの完全パスを入力します。zipファイル内から見た構造を保持してください。

これにより、単一のファイルがに抽出file.txtmyarchive.zip/path/to/unzip/to/file.txtます。


18
これがより良い答えです。
レッドバーン

1
生成されたファイル名を変えたい場合は処理しません。
オレグヴァスケヴィッチ14年

6
「-j」パラメータ:ジャンクパス。アーカイブのディレクトリ構造は再作成されません。すべてのファイルは抽出ディレクトリに保存されます(デフォルトでは、現在のファイル)。「-d」パラメータ:exdirにファイルを抽出
e1i45

1
@OlegVaskevich、質問はターゲットのファイル名が異なることを要求しない
-Tapemaster

ええ、知っています。まだ投票されています。:)
オレグヴァスケビッチ

25

よりシンプルなバージョン:

unzip ARCHIVE_NAME PATH_OF_FILE_INSIDE_ARCHIVE

これによりPATH_OF_FILE_INSIDE_ARCHIVE、現在のディレクトリに再作成されますが、指定されたファイルのみが抽出されます。

Zipアーカイブ内のすべてのファイルをリストするには:

unzip -l ARCHIVE_NAME

2
受け入れられている答えよりもはるかに簡単です。
-FractalSpace

確かに、うまく機能し、もっと簡単になりました
Mahmoud Ali

2

デフォルトでInfo-Zipを使用するmacOSでは

最初にファイルをリストして、必要なものを見つけます

unzip -l my.zip

次に、アーカイブから抽出するファイルのリストを提供します

unzip my.zip annoying/path/to/file

stdoutの場合は-pと組み合わせてください

unzip -p my.zip annoying/path/to/file >./file

1
明白な理由なしに人々がなぜ投票するのか理解できません。これは正しい答えです(macOSだけでなく)
FractalSpace

@FractalSpace明らかにそうではなく、OPが望んでいることの反対です。
コンラッドルドルフ

キーは、個々のファイルを取得することです。stdoutへの出力と-pフラグを使用したリダイレクトは簡単ですが、明示的に追加しました
キャメロンローウェルパーマー

2

簡単な使用:

unzip zipfile.zip path/inside/zip/file.txt

ファイルが膨張します。

$ unzip -l ./../html.zip | grep wp-config

     3328  07-22-2019 15:10   html/wp-config.php

     2898  01-07-2019 23:30   html/wp-config-sample.php

$ unzip ./../html.zip html/wp-config.php

     Archive:  ./../html.zip
     inflating: html/wp-config.php

$ ls -lrth

     total 4.0K
     drwxr-sr-x 2 apache apache 4.0K Jul 26 14:41 html

$ ls -lrth html/*

     total 4.0K
     -rw-rw-rw- 1 apache apache 3.3K Jul 22 15:10 wp-config.php

また、追加することができ-d outpath、ファイルを入れている場所を指定する引数を。
エフレン

そして、-j圧縮されたパスを避けるための議論
Efren
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.