2013-02-11 19 views
9

私はしばらく試してきましたが、これにかなり近づいていると思いますが、私はかなり新しいです。すべてのzipを見つけて解凍してください - Unix

多くのフォルダを含むフォルダがありますが、その中にはzipファイルがありますが、その中にはいくつかのものがあります。私はすべてのサブディレクトリ内のzipファイルをすべて解凍しようとしています。例えば

私が持っている:

ファイル/ A/something.javaを

ファイル/ B/somezipfile.zip

ファイル/ C/someotherfile.zip

ファイル/ D/AnotherZipFile.zip

zipに.javaファイルのみが含まれていると仮定して、それらのファイルを解凍して、結果を得る: files/A/something.ja VA ZIPファイルが残ったりしている場合、私は気にしない

ファイル/ B/javafile.java

ファイル/ C/someotherfilefromzip.java

ファイル/ D/Anotherfile.java

解凍後に削除されても問題ありません。

私がこれまでに試したことは何ですか。これは動作しません

find . -name *.zip | unzip 

1)私は、このように新しい午前配管を、使用することができます期待しました。

2)私は解決策をオンラインで使用して得た最も近いが、検索いくつかの時間を費やし:

find . -name '*.zip' -exec unzip '{}' ';' 

これは解凍が、私はそれらの場所に解凍したかった、現在の作業ディレクトリにそれらを解凍。私はまた、私が学びたいと思っているこのコマンドを理解していません。

ご迷惑をおかけして申し訳ありません。

おかげで、

答えて

26
find . -name '*.zip' -exec sh -c 'unzip -d `dirname {}` {}' ';' 

これは再帰的に*.zipパターンにマッチする名前のファイルの現在のディレクトリとそのサブディレクトリ内のルックスを指令します。 <filename>が検出されたファイルの名前です

-c 

unzip -d `dirname <filename>` <filename> 

:ファイルの場合は、2つのパラメータでコマンドshを実行しました。コマンドshはUnixシェルインタープリタです。オプション-cは、次の引数をシェルスクリプトとして解釈する必要があることをシェルに伝えます。だから、シェルは、次のスクリプト解釈:unzipシェルを実行する前に

unzip -d `dirname <filename>` <filename> 

を様々な置換を行うことによって、コマンドを拡張します。この特定の例では、実際にファイルが置かれるディレクトリ名を出力コマンドdirname <filename>の出力と

`dirname <filename>` 

を代入します。そのため、ファイル名が./a/b/c/d.zipであれば、シェルはこのようなunzipをこするします:代わりに

find . -name '*.zip' -exec sh -c 'unzip -d "`dirname \"{}\"`" "{}"' ';' 
+0

これは良い答えのように見えますが、(非常に速く)私がそれを理解するのを助けることができますか?ちょっと私はそれについて-execと{}マークの必要性を混同しています。 – ThePerson

+1

追加された説明 –

+0

zipsファイル名にスペースがあると問題があるようですが、これは簡単に修正できますか? – ThePerson

7
find . -name '*.zip' | xargs -n1 unzip 
19

使用-execdir

unzip -d ./a/b/c ./a/b/c/d.zip 

あなたは、ファイル名やディレクトリ名をZIP場合は、スペースを持って、これを使用-execの場合、実行するディレクトリではなく、ファイルが見つかったディレクトリでコマンドを実行しますfindから。

find . -name '*.zip' -execdir unzip '{}' ';' 
+0

幻想的に働いた。 '' {} '(ファイル名のプレースホルダ?)と '';' 'が別々の引用符である必要がある理由について説明していますか?ありがとう! –

+0

{}は、現在操作しているファイルを意味します – Tebe

関連する問題