zipファイル用のフォルダを作成してそれに展開する

zipファイルを選択して「ここで展開」を右クリックすると、zipファイル名のフォルダが作成され、zipファイルの内容全体が抽出されます。

しかし、私はシェルを介していくつかのzipファイルを変換したいと思います。 しかし、私がするとき

unzip filename.zip

"filename" フォルダは作成されず、すべてのファイルがカレントディレクトリに展開されます。

私はパラメータを見てきましたが、そのようなパラメータはありません。 私もやった

for zipfile in \*.zip; do mkdir $zipfile; unzip $zipfile -d $zipfile/; done

2. $ zipfileと4. $ zipfileの .zip 拡張子はsedで削除する必要があります。 私が行った場合

for zipfile in \*.zip; do mkdir sed 's/\.zip//i' $zipfile; unzip $zipfile -d sed 's/\.zip//i' $zipfile/; done 

それは動作していません。

$ zipfile.zip 拡張子を正しく置き換えるにはどうすればよいですか?

シェルスクリプトより簡単な方法はありますか?

42

5 答え

unzip file.zip -d xxx will extract files to directory xxx, and xxx will be created if it is not there. You can check the man page for details.

下のawk行は仕事をする必要があります:

ls *.zip|awk -F'.zip' '{print "unzip "$0" -d "$1}'|sh

下記の[テスト]、

note that I removed |sh at the end, since my zips are fake archives; I just want to show the generated command line here.

kent$  ls -l
total 0
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 001.zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 002.zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 003.zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 004.zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 005.zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 006.zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 007.zip

kent$  ls *.zip|awk -F'.zip' '{print "unzip "$0" -d "$1}'
unzip 001.zip -d 001
unzip 002.zip -d 002
unzip 003.zip -d 003
unzip 004.zip -d 004
unzip 005.zip -d 005
unzip 006.zip -d 006
unzip 007.zip -d 007
79
追加された
しかし、xxxがネストされたディレクトリのパスであれば、それは失敗し、 "抽出ディレクトリを作成できません"というメッセージが表示されます。もちろん、シェルを作成し、中間ディレクトリが存在するかどうかを確認してから、あらかじめ作成しておくことができます)、unzipコマンドだけで1つの作業をしたいと思っています。
追加された 著者 Scott Chu,
ありがとう、魅力のように動作します。
追加された 著者 creativeDev,
しかし私が理解していないのは、$ 0に完全なファイル名が含まれ、$ 1が ".zip"拡張子ではないことです。
追加された 著者 creativeDev,
@ジャック私はFS(Field Separator)として ".zip"を定義しました。したがって、001.zipは2つの部分 "001"と ""に分割されます。 $ 1は1番目のフィールドです。 $ 0はこの行でawkの "001.zip"という行全体で、フィールドは0ではなく1から数えられます。
追加された 著者 Kent,
ls は何も出力しないでください。 lsはディレクトリメタデータを対話的に調べるためのツールです。コードで ls の出力を解析しようとすると、何の試みも壊れてしまいます。 Globははるかにシンプルで正しいです: * .txtのファイルmywiki.wooledge.org/ParsingLs を読む
追加された 著者 Rany Albeg Wein,
このコマンドは素晴らしいですが、ファイル名にスペースが含まれていれば動作しません。スペースを考慮するには、 ls * .zip |を実行する必要があります。 awk -F'.zip '' {print "unzip \" "$ 0" \ "-d \" "$ 1" \ ""} '| sh
追加された 著者 KurtPreston,
1つは出力を解析するものではありません。 lsはデフォルトで-lahが有効になっているため、私のシステムでは動作しません。 lsはインタラクティブなツールです。パス名展開を使用します。
追加された 著者 Nobody,

"ここで抽出する"は、あなたが使用している unzip ラッパーの機能です。 unzip は実際にアーカイブにあるものだけを抽出します。おそらく、シェルスクリプトより簡単な方法はありません。 POSIX準拠のシェルを使用している場合は、 sedawk などは必要ありません。

for f in *.zip; do unzip -d "${f%*.zip}" "$f"; done

ZIPアーカイブにEclipseアーカイブなどのディレクトリが含まれている場合は(常に eclipse/が含まれています) code>)を使用すると、いずれの場合でも ./ eclipse */eclipse/eclipse.ini になります。ドライランで unzip する前に echo を追加してください。

36
追加された
情報ありがとうございます。
追加された 著者 creativeDev,
@ジャック、この答えは受け入れる答えでなければなりません。 ls の出力には何も使用しないでください。 ls は、ディレクトリメタデータを対話的に調べるためのツールです。コードで ls の出力を解析しようとすると、何の試みも壊れてしまいます。 Globははるかにシンプルで正しいです:* .zipファイルの 。 lsの解析を読む
追加された 著者 Rany Albeg Wein,

あなたがインストールされている7zipのコマンドラインバージョンであるp7zipを持っているなら、あなたは以下を使うことができます:

7z x '*.zip' -o'*'
6
追加された

aunpack from atool will do this by default for all sorts of archives.

1
追加された

スイッチの後にフォルダ名とスラッシュを追加します(例:

unzip -d newfolder/ zipfile.zip

zipは 'newfolder'というフォルダを作成し、そこにアーカイブを展開します。

末尾のスラッシュは必須ではありませんが、私はそれがちょうど古い習慣だと思います(私はDebianとUbuntuを使用しています)。

1
追加された