Wie kann ich eine dynamische Suche nach ZIP-Dateien in einem bestimmten Pfad (z. B. /opt/uploading/"*"/multiple .zip
Dateien) durchführen und diese in denselben Ordner wie die ZIP-Dateien entpacken?
Die folgende Funktion entpackt mehrere Zip-Dateien und entfernt Zip-Dateien. Ich möchte aber, dass die Zip-Dateien bei den entpackten Dateien vorhanden sind.
while true; do
find -iname '*.zip' > zipindex
test -s zipindex || break
for zip in $(cat zipindex); do unzip -o $zip && rm $zip; done
done
Antwort1
Nun, es rm $zip
werden die Zip-Dateien entfernt, also entfernen Sie sie.
Antwort2
Dies ist für eine for-Schleife viel besser geeignet als für eine while-Schleife. Auf diese Weise können Sie auch das unnötige Speichern von Ergebnissen vermeiden.find -iname '*.zip' > zipindex
Machen Sie stattdessen so etwas:
#!/bin/bash
for zip in $(find -iname '*.zip'); do
unzip -o $zip
done
Dadurch werden alle von „find“ erzeugten Zeilen durchlaufen.
Natürlich können Sie das Bash-Skript auch ganz weglassen und einen Find-Oneliner wie den folgenden erstellen:
find -iname '*.zip' -execdir unzip {} \;
BEARBEITEN: Dank @don_crissti und @ilkkachu ist es mir gelungen, den Aufruf einer weiteren Instanz der Shell in -exec zu vermeiden. -execdir ist gut zu wissen!
Antwort3
Mit GNU Parallel können Sie Folgendes tun:
find my_dir | grep -E '\.zip$' | parallel unzip
inotifywait -qmre MOVED_TO -e CLOSE_WRITE --format %w%f my_dir | grep -E '\.zip$' | parallel -u unzip
Auf diese Weise müssen Sie nicht warten, bis die nächste ZIP-Datei angezeigt wird.