2013-02-11 7 views
9

Ich habe seit einiger Zeit versucht und glaube, ich bin ziemlich nah daran, aber ich bin ziemlich neu in Unix, so habe ich das schwierig gefunden.Finden Sie alle Reißverschlüsse, und entpacken Sie sie an der Stelle - Unix

Ich habe einen Ordner, der viele Ordner enthält, von denen einige ZIP-Dateien enthalten, einige nicht. Ich versuche, alle Zip-Dateien in beliebigen Unterverzeichnissen an Ort und Stelle zu entpacken.

Zum Beispiel habe ich:

files/A/something.java

Dateien/B/somezipfile.zip

Dateien/C/someotherfile.zip

Dateien/D/AnotherZipFile.zip

Ich möchte sie entpacken (vorausgesetzt, die Reißverschlüsse enthalten nur .java Dateien), um ein Ergebnis zu haben wie: files/A/something.ja va

Dateien/B/javafile.java

Dateien/C/someotherfilefromzip.java

Dateien/D/Anotherfile.java

ich nichts dagegen, wenn die ZIP-Dateien bleiben oder sind nach dem Entpacken gelöscht, ist beides in Ordnung.

Was ich bisher versucht habe.

1) Ich erwartete ich verwenden könnte Rohrleitungen, die ich bin hier zu, wie folgt aus:

find . -name *.zip | unzip 

Dies funktioniert nicht.

2) ich einige Zeit mit der Suche verbrachte, wurde in der Nähe I ist eine Lösung online mit:

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

Diese unzips, sondern sie in das aktuelle Arbeitsverzeichnis entpackt, ich wollte, dass sie an Ort und Stelle entpacken. Ich verstehe auch diesen Befehl nicht, den ich gerne möchte, während ich versuche zu lernen.

Jede Hilfe wird sehr geschätzt.

Danke,

Antwort

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

Dieser Befehl sieht in dem aktuellen Verzeichnis und in dessen Unterverzeichnisse rekursiv nach Dateien mit Namen *.zip Pattern-Matching. Für Datei gefunden führt sie Befehl sh mit zwei Parametern:

-c 

und

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

Wo <filename> Name der Datei ist, die gefunden wurde. Befehl sh ist Unix-Shell-Interpreter. Die Option -c teilt Shell mit, dass das nächste Argument als Shell-Skript interpretiert werden soll.So Shell interpretiert das folgende Skript:

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

Bevor Sie unzip Shell den Befehl erweitert, durch verschiedene Ersetzungen zu tun. In diesem speziellen Beispiel ersetzt es

`dirname <filename>` 

mit Ausgabe von Kommando dirname <filename>, die tatsächlich Verzeichnisnamen gibt, wo Datei abgelegt wird. Also, wenn Dateinamen ./a/b/c/d.zip ist, Shell wird unzip wie folgt reiben:

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

Falls Sie Dateinamen oder Verzeichnisnamen Leerzeichen ZIP, verwenden Sie diese:

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

Das sieht wie eine gute Antwort aus, jede Chance, die Sie (sehr schnell) mir helfen könnten, es zu verstehen? Das bisschen Ich bin verwirrt darüber die Notwendigkeit für -exec und die {} Marken. – ThePerson

+1

Erklärung hinzugefügt –

+0

Ich habe ein Problem, wenn ein Leerzeichen im Namen der Zips-Datei ist, gibt es eine einfache Lösung dafür? – ThePerson

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

Verwenden -execdir statt von -exec, die den Befehl in dem Verzeichnis ausführt, in dem die Datei gefunden wird, nicht das Verzeichnis, das Sie find von ausführen.

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

Fantastisch gearbeitet. Stört es Sie zu erklären, was das "{}" tut (Dateiname Platzhalter?) Und warum das "" muss ein separates Zitat sein? Vielen Dank! –

+0

{} bedeutet die aktuelle Datei, in der Sie arbeiten – Tebe

Verwandte Themen