web-dev-qa-db-ja.com

すべてのzipを検索し、その場で解凍します-Unix

私はしばらくの間努力していて、これにかなり近いと信じていますが、私はUnixにかなり慣れていないので、これは難しいと感じています。

私は多くのフォルダを含むフォルダを持っています。その中にはZipファイルが含まれているものと含まれていないものがあります。所定のサブディレクトリにあるすべてのZipファイルを解凍しようとしています。

たとえば、私は持っています:

files/A/something.Java

files/B/somezipfile.Zip

files/C/someotherfile.Zip

files/D/AnotherZipFile.Zip

それらを解凍して(zipに.Javaファイルのみが含まれていると仮定)、files/A /something.Javaのような結果にします。

files/B/javafile.Java

files/C/someotherfilefromzip.Java

files/D/Anotherfile.Java

Zipファイルが残っているか、解凍後に削除されてもかまいません。どちらでも構いません。

私がこれまでに試したこと。

1)次のように、初めての配管を使用できると思っていました。

find . -name *.Zip | unzip

これは機能しません。

2)検索に時間を費やしましたが、オンラインでソリューションを使用して得た最も近いものは次のとおりです。

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

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

どんな助けでも大歓迎です。

ありがとう、

12
ThePerson
find . -name '*.Zip' -exec sh -c 'unzip -d `dirname {}` {}' ';'

このコマンドは、現在のディレクトリとそのサブディレクトリで、*.Zipパターンに一致する名前のファイルを再帰的に検索します。見つかったファイルの場合、次の2つのパラメーターを使用してコマンドshを実行します。

-c

そして

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

ここで、<filename>は見つかったファイルの名前です。コマンドshはUnixシェルインタープリターです。オプション-cは、次の引数をシェルスクリプトとして解釈する必要があることをシェルに指示します。したがって、シェルは次のスクリプトを解釈します。

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

unzipを実行する前に、シェルはさまざまな置換を行うことによってコマンドを展開します。この特定の例では、

`dirname <filename>`

コマンドdirname <filename>の出力で、ファイルが配置されているディレクトリ名を実際に出力します。したがって、ファイル名が./a/b/c/d.Zipの場合、シェルは次のようにunzipをこすります。

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

Zipファイル名またはディレクトリ名にスペースがある場合は、次を使用します。

find . -name '*.Zip' -exec sh -c 'unzip -d "`dirname \"{}\"`" "{}"' ';'
35

使用する -execdir の代わりに -exec。これは、findを実行するディレクトリではなく、ファイルが見つかったディレクトリでコマンドを実行します。

find . -name '*.Zip' -execdir unzip '{}' ';'
30
chepner
find . -name '*.Zip' | xargs -n1 unzip
7
Josh Jolly