Kann eine shell-Schleife entpacken Sie alle Dateien in einem Verzeichnis?
Ich habe gesehen, loops entpacken Sie alle zip-Dateien in einem Verzeichnis. Jedoch, bevor ich diese ausführe würde ich darauf achten, was ich zu laufen richtige Arbeit:
for i in dir; do cd $i; unzip '*.zip'; rm -rf *.zip; cd ..; done
Im Grunde möchte ich es, um Blick auf die Ausgabe von "dir" sehen Sie alle Ordner, für jedes Verzeichnis eine cd in es, entpacken Sie alle zip-Archive, dann entfernen Sie Sie, dann cd zurück und es wieder tun, bis es nicht mehr.
Ist das etwas, was ich tun sollte, in einem einzelnen Befehl oder sollte ich in Erwägung ziehen diese in Perl?
- Hallo und herzlich willkommen auf StackOverflow. Um Ihren code leichter lesbar, verwenden Sie bitte den code-tag
- für Ihre Informationen verwenden, können Sie cd, um wieder in das Vorherige Verzeichnis.
- fertig 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
teilweise getestet:
führt die
cd
/unzip
/rm
Kette für jede subdir.find ... | xargs -0 ...
zu handhaben whitespace-Zeichen , oder muss escaped quotes die Arbeit machen?find . -name "*.zip" -exec rm -rf {} \;
(Sie müssen nicht auf sh -c ... wenn Sie nur ein Befehl)Ein paar Punkte hinzufügen, was andere gesagt haben:
'*.zip'
die shell nicht Wildcards und entpacken Sie versuchen zu verarbeiten, ein Archiv, das wörtlich genannt*.zip
-r
als parameter anrm
wenn Sie wollen einfach nur löschen von einzelnen Dateien. Das ist nur unnötig gefährlich, da jeder rekursive löschen von Unterverzeichnissen, würde wohl nicht beabsichtigt sein.unzip
und entfernen Sie nur die zip-Datei entpacken, wenn erfolgreich war (zum Beispiel könnten Sie sagenif unzip *.zip; then rm *.zip; fi
oder sogar eine explizitefor
- Schleife zum verarbeiten der zip-Dateien nacheinander)Sollten Sie sich gut im Allgemeinen. Für das debugging nur, indem alle Befehle in der Schleife mit
echo
wird Ihnen sagen, wie die Variablen zu erweitern. Sie können auch verwenden Sie immerrm -i
gefragt zu werden, anstattrm
gehen Sie mit etwas mit-f
.Die einzelnen Zitate in Ihrer
unzip
Anruf wird nur entpacken von Dateien namens*.zip
, d.h. die*
lässt sich nicht erweitern. Verwenden Sie doppelte Anführungszeichen verwenden (oder gar keine Zitate überhaupt).Ihren loop jetzt davon ausgegangen, dass alle Verzeichnisse
$i
sind direkt unter dem aktuellen. Eine allgemeinere Lösung wäre die Verwendung der directory-stack (pushd
undpopd
);dir
war eine variable, wenn es nicht so mein Beispiel falsch war. Feste hier und jetzt davon ausgegangen, dassdir
ist eine variable halten Sie die Verzeichnis-Auflistung.Verwenden
*
um den Inhalt des aktuellen Verzeichnisses:Sollten Sie auch sicherstellen, dass etwas ist ein Verzeichnis, bevor Sie versuchen, die cd hinein. In der bash dies geschieht wie folgt:
Sollten Sie auch vorsichtig sein, zu überprüfen, dass der unzip-Vorgang erfolgreich war, vor dem löschen der zip-Datei. Es gibt keine Notwendigkeit zu verwenden rekursive Kraft löschen zum löschen einer einzelnen Datei.
Ich denke, das sprengt die Grenze für das, was er tut, sinnvoll mit einer einzigen Zeile. Legen Sie es in ein shell-Skript, und formatieren Sie es über mehrere Zeilen.
Wenn du wissen willst, ob etwas funktionieren wird, aber seid vorsichtig, es ist destruktive Folgen haben, ein wenig zu einem Zeitpunkt:
Stellen Sie sicher, dass Sie die richtigen Dateien:
Stellen Sie sicher, entpacken Sie die Dateien, bevor Sie die Dateien löschen:
Und bevor Sie tun, die full monty, ein back-up von Ihrem Verzeichnis.