Bash-Skript zum Entpacken mehrerer Dateien

726
ducsu

Ich habe verschiedene ZIP-Dateien, die Unterordner und keine Unterordner enthalten. Ich möchte die gesamte ZIP-Datei in den Ordner extrahieren. Mein aktuelles Skript macht was ich will, wenn es Unterordner enthält. Wenn es jedoch keinen Unterordner gibt, werden diese separat in demselben Ordner aufgelistet. Dies ist verwirrend, da ich wissen muss, was sie sind.

Bevor Sie die Ordnerstruktur entpacken :

JCB-1.zip

- JCB  - KDY231-8000018  -> file1.txt, file2.txt  - KGC30-0152537  -> file1.txt, file2.txt  - S330V-0034006  -> file1.txt, file2.txt  

XZC605-0002319.zip

 - file_1.txt ,file_2.txt, file_3.txt 

ZNE10-7845839.zip

- ZNE10-7845839  -> file1.txt, file2.txt  

Nach dem Entpacken der Ordnerstruktur :

- KDY231-8000018  - KGC30-0152537  - S330V-0034006  - file_1.txt  - file_2.txt  - file_3.txt  

Aktuelles Skript

#!/bin/bash  ZIPDIR=/mnt/www/log/_tmp TMP=/tmp/zipfiles  cd $ZIPDIR rm tmp/zipfiles 2>/dev/null  ls -l *.zip if [ $? -eq 0 ] then echo ".zip file found"  ls -1 $ZIPDIR/*.zip > $TMP  for i in `cat $TMP` do unzip -o $i && rm $i done fi;  # Removing top level folder mv $ZIPDIR/JCB/* . && rm -R JCB  if [ $? -eq 1 ] then echo "NOT found" fi; 

Meiner Meinung nach ist die ZIP-Datei, die keine Unterordner enthält. Ich muss sie aus fileName.zip und nicht aus file_1.txt erstellen, da der Name keinen Sinn macht. Das Endergebnis ist also diese Struktur nach dem Entpacken.

Final Expecting entpacke Ordnerstruktur :

- KDY231-8000018  - KGC30-0152537  - S330V-0034006  - XZC605-0002319  

Aktualisiert: Der von @confetti bereitgestellte Code funktioniert. Vielen Dank. Es gibt noch eine andere ZIP-Dateistruktur, die ich vergessen habe zu erwähnen und die ich oben aufgenommen habe. Hier ist der endgültige Code mit meinen Änderungen. Es ist vielleicht kein effizienter Code, aber es scheint für mich zu funktionieren.

#!/bin/bash  zipdir=/mnt/www/log/_tmp cd $zipdir  for i in *.zip; do folder=$ mkdir -p $folder unzip -o $i -d $folder && rm $i subdirs=$(find $folder -type d | wc -l) if [[ $subdirs -eq 2 ]]; then mv ./$folder/* ./ rm -r $folder else if [[ $subdirs -gt 1 ]]; then mv ./$folder/*/* ./ rm -r $folder fi fi done 
1
[* Warum sollten Sie die Ausgabe von 'ls' nicht analysieren *] (https://mywiki.wooledge.org/ParsingLs). Kamil Maciorowski vor 5 Jahren 0

1 Antwort auf die Frage

0
confetti
#!/bin/bash ZIPDIR=/mnt/www/log/_tmp TMP=/tmp/zipfiles cd "$ZIPDIR" rm tmp/zipfiles 2>/dev/null  for i in ./*.zip; do folder=$ mkdir "$folder" unzip -o "$i" -d "$folder" && rm "$i" subdirs=$(find "$folder" -type d -printf ".\n" | wc -l) if [[ $subdirs -gt 1 ]]; then mv ./$folder/*/* ./ rm -r "$folder" fi done 

Getestet mit Dateien, die Ihrer gezeigten Struktur ähneln, und funktioniert perfekt für mich.

Ich bekomme Fehler bei verschiedenen ZIP-Dateien und es werden für einige Ordner 2 Ordner tief gespeichert. ** JCB-6.zip <- Enthält einen Unterordner ** `./batchUnzip.sh: Zeile 13: [[: JCB-6 JCB-6 / JCB JCB-6 / JCB / NCP51-0284052: Syntaxfehler im Ausdruck ( Fehlertoken ist "JCB-6 / JCB JCB-6 / JCB / NCP51-0284052") `** XZC605-0002319.zip <- Kein Unterordner **` ./batchUnzip.sh: Zeile 13: [[: XZC605- 0002319: Wert zu groß für Basis (Fehlertoken ist "0002319") ` ducsu vor 5 Jahren 0
Mein Fehler. Ich habe das "|" vergessen wc -l` hinter dem find-Befehl, um die tatsächliche _Anzahl_der Unterverzeichnisse abzurufen. Ich habe meine Antwort bearbeitet. Es wurde im Grunde eine Stringliste von Unterverzeichnissen mit einer vorherigen Zahl verglichen. Eops. confetti vor 5 Jahren 0
Danke, dass Sie sich die Zeit genommen haben. Haben Sie die Möglichkeit bekommen, den Code zu testen? Während der Fehler weg ist, gibt es mir ein seltsames Ergebnis. ducsu vor 5 Jahren 0
Schau es dir jetzt an. Ich habe den `./$ Ordner / *` im `mv`-Befehl am unteren Rand vermisst. Im Wesentlichen versucht man, einen Ordner in sich selbst zu verschieben, eops. Ich habe den aktuellen Code ausprobiert und es funktioniert für mich. confetti vor 5 Jahren 0