私はしばらくの間努力していて、これにかなり近いと信じていますが、私は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 '{}' ';'
これは解凍しますが、現在の作業ディレクトリに解凍します。その場で解凍したかったのです。また、私が学ぼうとしているこのコマンドを理解していません。
どんな助けでも大歓迎です。
ありがとう、
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 \"{}\"`" "{}"' ';'
使用する -execdir
の代わりに -exec
。これは、find
を実行するディレクトリではなく、ファイルが見つかったディレクトリでコマンドを実行します。
find . -name '*.Zip' -execdir unzip '{}' ';'
find . -name '*.Zip' | xargs -n1 unzip