• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

(Zip) Archive rekursiv entpacken relativ von Hauptordner zu Zielordner

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.561
Nabend,

folgendes ist gegeben: Mehrere Unterordner eines Hauptordners mit zigfach Zip Archiven in Unterordnern.

Ich würde nun gerne alle Archive nach Möglichkeit in einen anderen Ordner, aber bei gleicher Ordnerstruktur entpacken wollen.

Heißt - "Hauptordner/Folder1/*.zip" soll entpackt werden nach "zielOrdner/Folder1/dateien"

Wie stelle ich das am besten an? / Gibt es da etwas fertiges irgendwo das man vielleicht nur um den Entpackparameter ergänzen müsste?

Per Hand ist es bei hunderten von Ordnern nicht mehr machbar und ich will auch das nichts in den "Hauptordner" gelangt, sondern alles in "Zielordner" landet, was entpackt ist.

Ich bin in Bash nur nicht sonderlich gut.... würde das aber so lösen, meines Wissens nach, habe aber einfach zu wenig damit gearbeitet und wüsste auch nicht wie man in Bash überprüfen kann ob es einen Ordner schon gibt, oder sonst wie mit Logik arbeitet damit a) Ordnerstruktur und b) Dateien dort landen wo sie sollen.
 

tux

NGBler

Registriert
24 Aug. 2013
Beiträge
238
Ort
München
Schau mal hier oder hier. Eventuell hilft Dir das weiter.

Die Vorgehensweise mit der Windowssuche sollte doch was für Dich sein.
 
Zuletzt bearbeitet:

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.561
  • Thread Starter Thread Starter
  • #3
Hilft nicht wirklich, ich glaube was ich suche, kann nur ein Bash Skript.
 

tux

NGBler

Registriert
24 Aug. 2013
Beiträge
238
Ort
München
Hm. Das wundert mich jetzt aber ein bisschen.
Habe folgendes probiert:

Ausgangsordner:
a
mit folgenden Unterordner:
a --> enthält a.rar
b --> enthält b.rar
c --> enthält c.rar
d --> enthält d.rar

Mit der Windowssuche habe ich in Ordner a nach rar Dateien gesucht, dann alle markiert --> entpacken nach (Zielordner b) und das Flag "Archive in Unterverzeichnissen entpacken" setzen und ich habe die selbe Ordnerstruktur (mit Unterordner) in Zielordner b und alle rar Dateien in den Unterordner sind entpackt.

Ein Script habe ich in meinem ersten Link gefunden.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.561
  • Thread Starter Thread Starter
  • #5
Für Windows, kommt es aber nicht in Frage.

Das sollte unter Linux laufen.
 

Meta

gesperrt

Registriert
11 Feb. 2017
Beiträge
1.379
Ort
Ostberlin
Sicher geht das mit Bash. Mit irritiert nur die Beschreibung des Problems (rekursiv, Folder1, *.zip). Ein möglichst wirklichkeitsnahes Beispiel mit vorhandenem Input und gewünschtem Output wäre hilfreich.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.561
  • Thread Starter Thread Starter
  • #7
Meta, du hast "Quellordner/Ordner1/Archiv.zip" - daraus soll werden: "Zielordner/Ordner1/EntpackteDatei"....

Eigentlich was relativ simples, wenn man weiß wie man Ziel, mkdir, find oder grep und Ziel beeinträchtigt und das als Ziel übergibt an den Entpacker.
 

Meta

gesperrt

Registriert
11 Feb. 2017
Beiträge
1.379
Ort
Ostberlin
Eigentlich was relativ simples

- was verstehst du unter "rekursiv" in diesem Fall, ist "Quellordner" ("Hauptordner") immer der selbe Pfad?
- ist "folder1" nur ein Ordner oder Platzhalter für einen Pfadnamen?
- befindet sich in "folder1" nur eine zip-Datei oder 0-x?
- falls sich in "folder1" mehr als ein Archiv befindet, was soll dann erfolgen, wenn beim Auspacken Dateinamen kollidieren?

Aber sonst ist es easy :D
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.561
  • Thread Starter Thread Starter
  • #9
Naja, "simple" vom Aufbau her, ich spreche nicht vom Skript:

- was verstehst du unter "rekursiv" in diesem Fall, ist "Quellordner" ("Hauptordner") immer der selbe Pfad?

Der Quellordner bleibt gleich, es ändert sich nur "Ordner1Name", "Ordner2Name", "Ordner3NameXYZ" - OrdnerName kann aber auch Unterordner haben!

- ist "folder1" nur ein Ordner oder Platzhalter für einen Pfadnamen?

Ordner/Folder ist ein Platzhalter, das einzige was ich angeben wollen würde, wäre "Hauptordner", den Rest sollte sich das Ding selbst suchen, da es kein festes Muster gibt.

- befindet sich in "folder1" nur eine zip-Datei oder 0-x?

0-x

- falls sich in "folder1" mehr als ein Archiv befindet, was soll dann erfolgen, wenn beim Auspacken Dateinamen kollidieren?

Nein, kollidieren sollte da nichts, würde ich von ausgehen.


Gegeben ist in etwa folgendes:

Quellordner (gebe ich an, in diesem soll gesucht werden nach Unterordnern und Ordner in diesen Ordner (kann sein "Ordner1/zip.zip", oder "Ordner1/Unterordner1-x/zip..zip")
--- Ordner1
------- ZipXYZ.zip (Namen sind nicht hochgezählt sondern dynamisch!)
------- Zip2.zip
------- DateinameXYZ.zip
--- Ordner2
------- Zip1.zip
------- Zip2.zip

Entpackt werden sollte dann irgendwie so:
ZielOrdner (wird angebeben)
--- Ordner1 (gleicher Name wie aus Quelle, soll aber dynamisch erzeugt werden wenn in QuellOrdner/Ordner1 gefunden)
------- Zip1Dateien
------- Zip2Dateien
--- Ornder2 (identischer Pfadname, bis auf Quellordner)
------- Zip1Dateien
------- Zip2Dateien

usw.
 

braegler

Aktiver NGBler

Registriert
14 Juli 2013
Beiträge
898
Nette Geschichte....mal eine kleine Frage am Rande (wie Du bemerkst stelle ich immer nur doofe Fragen , liefere aber keine Lösungen ) :
Enthalten die Zips ihrerseits auch Ordnerstrukturen oder "nur" die Dateien.
MeinArchiv.zip
--datei1
--datei2
--verzeichnis1-datei3
--verzeichnis2-datei1
.....

Wenn Strukturen enthalten sind, sollen die entsprechend aufgelöst werden oder alles in das eine Verzeichnis gepackt werden (Dabei würde natürlich "datei1" aus dem root der gespoilerter Zip von jener im Zip-Verzeichnis "verzeichnis2" überschrieben werden ?

Nachtrag:
Reicht vielleicht auch schon sowas?
Code:
#!/bin/bash

STARTDIR=$1
zips=$(find $STARTDIR -iname '*.zip')
for zipfile in $zips
do
goto=$(dirname "$zipfile")
zipname=$(basename "$zipfile")
cd "$goto"
unzip -n "$zipname"
done
 
Zuletzt bearbeitet:

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.561
  • Thread Starter Thread Starter
  • #11
Nein die Frage ist nicht dumm, sondern äußerst relevant... was ich nicht erwähnt habe bzw. auch gar nicht kontrolliert, die Zips enthalten Ihrerseits auch zum Teil Zip Archive, in denen einzelne Dateien sind.

Also sieht die Struktur ungefähr so aus:
QuellOrdner/Ordner1/Zip1 -> ZipA, ZipB, ZipC (in ZipA bis C sind nur Datendateien ohne Ordner).

Heißt die Anforderung würde dann so aussehen, dass Zip1 entpackt werden muss, dann ZipABC... entpackt werden müsste und das nach Anlegen der ersten Ordnerstruktur, so fern ein oder mehrere Archive entpackt sind, sollen diese ins gleiche Verzeichniss (enthalten keine weiteren Ordner), entpackt werden.
Danach können die entpackten Zips (A, B, C) gelöscht werden, jedoch nicht die "Originale" aus QuellOrdner. ;)

Nachtrag:
Reicht vielleicht auch schon sowas?
Code:
#!/bin/bash

STARTDIR=$1
zips=$(find $STARTDIR -iname '*.zip')
for zipfile in $zips
do
goto=$(dirname "$zipfile")
zipname=$(basename "$zipfile")
cd "$goto"
unzip -n "$zipname"
done

Wenn unzip die Ordnerstruktur des Pfades in Zielpfad anlegt, dann ja, ansonsten sollte die Struktur erhalten bleiben die in Quellordner vorliegt und in Zielordner genauso erstellt werden. :)
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.561
  • Thread Starter Thread Starter
  • #13
Eher leider ein Projekt. Schreib ich dir in Batch, nicht in bash. Die Syntax ist mit zu krude, sorry, sorry :o

Vielen Dank für das Angebot, aber die Zeit brauchst du dafür nicht aufbringen nen Windows "Port" zu schreiben, jedenfalls nicht für mich - ich sitze an einer Linux Kiste und kann daher damit nichts anfangen ;)
 

Metal_Warrior

Defender of Freedom
Teammitglied

Registriert
10 Aug. 2013
Beiträge
6.830
Ort
/dev/mapper/home
@Meta: BATCH? Weil dir die Bash-Syntax zu krude ist?

Hast du nen Fetisch für mehrfache Verschachtelungen von %%? Ich krieg jedes Mal Ausschlag, wenn ich ne Batch lese, weil sorry, das ist ja wohl alles, nur nicht durchdacht und logisch.

@Split
Machs doch Folgendermaßen: Kopiere den Quellbaum komplett ins Ziel, suche die erste Zip, springe in den Ordner, entpacke sie, lösche sie, springe wieder ins Hauptverzeichnis, suche erste Zip etc. Am Ende solltest du keine Zips mehr dort drin haben, nur noch die Daten in ihren jeweiligen Ordnern und mit ihren jeweiligen Strukturen. Eigentlich ne einfache Schleife.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.561
  • Thread Starter Thread Starter
  • #16
@Metal_Warrior:

Hm joa, so könnte man es auch machen, aber das wäre unnötige "Duplikation" der Daten...... ansonsten aber eigentlich eine schöne Idee.

----

Ich hab mal was gebastelt..... zumindest die Ordnerstrukturen werden "geklont" :)

Aber nagelt mich nicht auf das Skript fest, das ist mein Zweitlingswerk :D
Und Haftung für Schäden werden nicht übernommen, aber es wird auch noch nichts entpackt.... schaue ich mir morgen früh mal an.

Und ja, der Quellordner muss die Daten in einem Unterordner haben, damit das Teil richtig "anspringt" - irgendwie hab ich das noch nicht anders lösen können, weil er sonst mit "mkdir" verucht das Hauptverzeichniss beim ersten "crawlen" anzulegen in dem Zielordner.... nicht sonderlich schön, aber nu.

Update:
Alte Version entfernt, da nicht wirklich tauglich, dafür lüppt diese Variante um so besser :D
Allerdings werden nur Ordnerstrukturen angelegt, Dateibehandlung ist auf dem Schirm.

Update2:
Neue Version, alten Code entfernt... damit lüppt es nun.... auch mit dem entpacken :)

[src=bash]#!/bin/bash
#
# The code is provided as is.
#
# Author: theSplit, 2017
#
# Description:
# Mirrors the folder structure from source to target folder and extracting
# found zip archives in those folders, unpacking any packed packed zips using "unzip" tool
#
# Usage:
# bash scriptname.sh /folder1/src /folder2/target
#
#
#
# Minor options
# Verbosity level 0 no verbose, 1 some, 2 extra info
BEVERBOSE=1
# If set to 1 do nothing the app just gives output if verbose, otherwise no actions are taken
DONOTHING=0


#---------------------------------------------------------------------------------------------------------------------------------
echo "Starting..."
# Stop editing here
FOLDERCOUNT=-1
SUBLEVEL=0
declare -a SUBPATHS

shopt -s dotglob
shopt -s nullglob


#---------------------------------------------------------------------------------------------------------------------------------
#

function unpackFile {
cd $1

if [[ $BEVERBOSE -gt 0 ]]; then
echo "Unpacking '$3' to '$2'"
fi

if [[ ! -f $3 ]]; then
return
fi

unzip -qu $3 -d "$2"

if [[ $5 -ne 0 ]]; then
EXTRAPACKED=(*.$4)
while [[ ! -z $EXTRAPACKED ]]; do
unpackSubPacks $2 $4

cd $2
EXTRAPACKED=(*.$4)
done
fi

cd $1
}

function unpackSubPacks {
cd $1

EXTRAPACKED=(*.$2)
for UNPACKEDARCHIVE in ${EXTRAPACKED[@]}
do
unpackFile $1 $1 $UNPACKEDARCHIVE $2 0
rm $UNPACKEDARCHIVE
done
}

function mirrorPathes {
FOLDERCOUNT=$(($FOLDERCOUNT+1))

#-------------------------------------------------------------------------------------------------------------------------------
# Navigate into src dir order

cd $DESTDIR
for SUBDIRECTORY in ${SUBPATHS[@]}
do
if [[ DONOTHING -ne 1 ]]; then
if [[ ! -d $SUBDIRECTORY ]]; then
$(mkdir $SUBDIRECTORY)
fi

cd $SUBDIRECTORY
fi
done
TARGETPATH=$PWD

cd $SRCDIR
for SUBDIRECTORY in ${SUBPATHS[@]}
do
cd $SUBDIRECTORY
done
SOURCEPATH=$PWD

FILESINPATH=(*.zip)
if [[ $DONOTHING -eq 0 ]]; then
for FILE in ${FILESINPATH[@]}
do
if [[ $BEVERBOSE -gt 0 ]]; then
echo "SOURCE: $SOURCEPATH"
echo "TARGET: $TARGETPATH"
echo "FILE: $FILE";
fi
unpackFile "$SOURCEPATH" "$TARGETPATH" "$FILE" zip 1
done
fi


#-------------------------------------------------------------------------------------------------------------------------------
# Some output if present
if [[ BEVERBOSE -gt 1 ]]; then
echo "CURRENT DIRECTORY: $PWD"
fi

#-------------------------------------------------------------------------------------------------------------------------------
# Acquire pathes to crawl into

PATHES=(*/)
for PATHPARTS in ${PATHES[@]}
do
ENTRY=$(basename $PATHPARTS)

if [[ $SUBLEVEL -gt -1 ]]; then
SUBPATHS[$SUBLEVEL]=$ENTRY
SUBLEVEL=$(($SUBLEVEL+1))
fi

mirrorPathes $ENTRY

if [[ $SUBLEVEL -gt 0 ]]; then
SUBPATHS[$SUBLEVEL]=
fi

SUBLEVEL=$(($SUBLEVEL-1))

done
}
# End to mirrorPathes
#---------------------------------------------------------------------------------------------------------------------------------


#---------------------------------------------------------------------------------------------------------------------------------
# Starting
#---------------------------------------------------------------------------------------------------------------------------------
SRCDIR=$1
DESTDIR=$2

if [[ -z $SRCDIR ]]; then
shopt -u dotglob
shopt -u nullglob
echo "Starting directory is missing."
exit
fi

if [[ -z $DESTDIR ]]; then
shopt -u dotglob
shopt -u nullglob
echo "Destination directory is missing."
exit
fi

echo "Starting folder mirroring and extraction of zip files in:"
echo "Source: $SRCDIR"
echo "Target: $DESTDIR"

mirrorPathes $SRCDIR

shopt -u dotglob
shopt -u nullglob

echo "Processed folders: $FOLDERCOUNT"
echo "Finished execution."
exit


[/src]
 
Zuletzt bearbeitet:

braegler

Aktiver NGBler

Registriert
14 Juli 2013
Beiträge
898
Hab nochmal was gebastelt... quick and dirty...
Sucht im Verzeichnis nach zips, entpackt sie in eigene Unterverzeichnisse ( Test1.zip -> Test1/ , wenn das Verzeichnis bereits vorhanden ist, wird in Test1_ex_UnixTimeStamp/ entpackt).
Danach wird nach neueren Zips gesucht und diese ebenso entpackt....
das ganze geht so weiter, bis keine neuen Zips mehr vorhanden sind.
[src=bash]#!/bin/bash

STARTDIR=$1
START=0



subzipcount=$(find "$STARTDIR" -iname '*.zip' -newerct "$(date '+%Y-%m-%d %H:%M:%S' -d @$START)" | wc -l)
subzips=$(find "$STARTDIR" -iname '*.zip' -newerct "$(date '+%Y-%m-%d %H:%M:%S' -d @$START)")
START=$(date +%s)
sleep 1
while [ $subzipcount -gt 0 ]
do
echo "Found"$subzipcount" new zips"

for zipfile in $subzips
do
goto=$(dirname "$zipfile")
cd "$goto"
zipname=$(basename "$zipfile")
exname=$(basename "$zipfile" ".zip")
if [ -d "$exname" ]; then
exname="$exname""_ex_""$START"
fi


unzip -d "$exname" "$zipname"
done

subzipcount=$(find "$STARTDIR" -iname '*.zip' -newerct "$(date '+%Y-%m-%d %H:%M:%S' -d @$START)" | wc -l)
subzips=$(find "$STARTDIR" -iname '*.zip' -newerct "$(date '+%Y-%m-%d %H:%M:%S' -d @$START)")
START=$(date +%s)
if [ $(date +%s) -eq $START ]
then
sleep 1
fi


done
[/src]

Die sleeps sind zwar hässlich. Aber "ct" ist halt nur Sekunden genau.
 
Zuletzt bearbeitet:

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.561
  • Thread Starter Thread Starter
  • #18
@braegler: Passt nicht so ganz, weil die Dateien in das Verzeichnis der ZIP, wenn auch mit "UnterordnerZIPNAME/Dateien" entpackt werden.

Genau das "Polluting" des Quellverzeichnisses sollte nicht geschehen. ;) Eher eine Kopie der Ordnerstruktur mit den Daten der ZIPs in selbigen.
 

Meta

gesperrt

Registriert
11 Feb. 2017
Beiträge
1.379
Ort
Ostberlin
Ich liebe Einzeiler und "%". Also, bei mir auf dem Mac geht's, hab's jetzt aber nicht ewig getestet.

[src=bash]#!/bin/bash
# Proper header for a Bash script.

Archive=/Users/Private/Archive
Daten=/Users/Private/Daten
# sollten eventuell angepasst werden

find "$Archive" -iname *.zip |gsed -r "s#$Archive(\/.*\/).*#\1#" |awk -v "Archive=$Archive" -v "Daten=$Daten" '{!a[$0]++} END {for (i in a) {cmd=sprintf("for f in \"%s%s*.zip\"; do mkdir -p \"%s%s\" && unzip \"$f\" -d \"%s%s\"; done\n",Archive, i, Daten, i, Daten, i); system(cmd)}}'

exit[/src]

Good luck :T
 

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.504
Nice, kannst du das evtl. für uns console-casuals aufdröseln? Fände ich ganz spannend :D.
 
Oben