14

私はしばらくの間努力していて、これにかなり近いと信じていますが、私は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 '{}' ';'

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

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

ありがとう、

4

3 に答える 3

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

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

-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 \"{}\"`" "{}"' ';'
于 2013-02-11T13:45:36.567 に答える
37

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

find . -name '*.zip' -execdir unzip '{}' ';'
于 2013-02-11T14:17:55.550 に答える
9
find . -name '*.zip' | xargs -n1 unzip
于 2013-02-11T13:54:46.383 に答える