tobatoba
Goto Top

Mac OS X - Shell: 2. Ordnerebene kopieren, aus allen weiteren Unterordnern nur die Tiffs unter dieser Struktur behalten?

Liebe Gemeinde,

vielleicht könnt Ihr mir weiterhelfen:

Ich habe folgende Ordnerstruktur:

-> 1. Ebene, Ordnername (z.B.) : "Zahlenordner"
--> 2. Ebene ca. 1000 Ordner, deren Ordnernamen aus einer Zahl besteht
---> Unterhalb der 2. Ebene kommt dann pro Ordner der 2. Ebene heterogenes Zeug ... weitere Ordner, irgendwelche Dateien

Ich würde gern den Ordner der 1. Ebene - also "Zahlenordner" - kopieren, dabei die Ordnernamen der 2. Ebene behalten, ABER das ganze heterogene Zeugs unterhalb der 2. Ebene möchte ich - bis auf dort irgendwo liegende *.tif-Dateien - alles loswerden loswerden (also alle Unterordner und Dateien die nicht auf TIF enden ... -> es soll keine dritte Ebene mehr geben sondern nur noch die TIF-Daten ...)

Habt Ihr eine Idee?
Ich scheitere ständig am Shellscript ...

Viele Grüße.

Content-Key: 311443

Url: https://administrator.de/contentid/311443

Printed on: May 7, 2024 at 10:05 o'clock

Member: Kraemer
Kraemer Aug 01, 2016 at 09:55:36 (UTC)
Goto Top
Moin,
Zitat von @tobatoba:
Ich scheitere ständig am Shellscript ...
Kann man das mal sehen?

Gruß Krämer
Member: aqui
aqui Aug 01, 2016 at 09:55:44 (UTC)
Goto Top
...dann wärs doch eher was für die Rubrik Batch & Shell hier damit die Skript Wizzards das auch lesen ?!
Member: tobatoba
tobatoba Aug 01, 2016 at 10:54:53 (UTC)
Goto Top
rsync -rav --include='/^[^x0]\d/' --include='*.tif' --exclude='/^0\d/' '~/tobatoba/zahlenordner' '~/tobatoba/zahlenordner1'

Hier kommt noch eine Besonderheit zum Ausdruck.
Die 2. Ebene besteht aus Zahlen ohne führende Null.
Die Ordner ab der 3. Ebene bestehen - wenn Unterordner vorhanden - immer aus Unterordnern mit führenden Nullen bzw. mindestens einer führenden Null.
Member: tobatoba
tobatoba Aug 01, 2016 at 10:58:03 (UTC)
Goto Top
Okay, danke für den Hinweis.
Kann ich die Frage dorthin verschieben oder muss ich die Frage neu einstellen (sorry bin neu, - ist meine erster Beitrag hier)?
Member: micneu
micneu Aug 15, 2016 at 15:19:41 (UTC)
Goto Top
kannst du mal bitte ein bild der verzeichnis strucktur zeigen,
ich bin schon ziemlich fit in bash auf dem mac
Member: tobatoba
tobatoba Aug 15, 2016 at 15:55:25 (UTC)
Goto Top
meine Lösung sieht zwischenzeitlich in etwa so aus:
clear
echo $''  
echo $'Zuerst werden die nicht benötigten INDEX, INFO und INFO.CACHE Dateien aus allen Verzeichnissen gelöscht!'  
echo $'  Dieser Vorgang wurde bereits automatisch gestartet. Bitte das Programm möglichst nicht abbrechen.'  
echo $'  Für diesen Vorgang gibt es im Moment keine Fortschrittsanzeige.'  
echo $''  
echo $'Im Anschluss werden alle Bilddaten aus ihren Unterordnern auf einer höher gelegenen Ordnerebene zusammengeführt (kopiert). '  
echo $'  Dieser Vorgang kann auch relativ lange dauern. Es ist jedoch möglich sich zu entscheiden ob der Vorgang gestartet werden soll oder nicht.'  
echo $'  Beim kopieren ist Fortschrittsanzeige für jede Datei sichtbar (Bilschirm scrollt).'  
echo $''  
echo $'Zuletzt können die ursprünglichen Ordner mit den ursprünglichen Bilddaten gelöscht werden (ACHTUNG, bitte aufmerksam sein).'  
echo $'  Auch an dieser Stelle gibt es noch eine Entscheidungsmöglichkeit vor der tatsächlichen Ausführung.'  
echo $'  Im Ergebnis bleiben nur die kopierten Dateien auf der oberen Ordnerebene erhalten, der Rest wird gelöscht.'  
sleep 10
#wenn wirklich alle Dateien INDEX, INFO und INFO.CACHE - auch auf der untersten Ordnerebene gelöscht werden sollen dann -maxdepth 4 einstellen.
#das kann dann aber im ergebnis wirklich bis zu 45 minuten bearbeitungszeit kosten.
#es ist eigentlich nicht notwendig, da diese Daten im letzten Schritt sowieso mit gelöscht werden.
find /Volumes/ELEMENTS/BereitzumScannenNimrod/ -maxdepth 3 -type f -name 'index' -exec rm '{}' ';'  
find /Volumes/ELEMENTS/BereitzumScannenNimrod/ -maxdepth 3 -type f -name 'info' -exec rm '{}' ';'  
find /Volumes/ELEMENTS/BereitzumScannenNimrod/ -maxdepth 3 -type f -name '*info.cache' -exec rm '{}' ';'  
echo $''  
echo $'-------------------------> Alle INDEX, INFO und INFO.CACHE Dateien wurden gelöscht!'  
echo $''  
echo $'-------------------------> ACHTUNG: Entscheide, ob JETZT alle TIF-Quelldaten aus den Unterordnern eine Ebene höher kopiert  werden sollen -----> (Yes / No)'  
        read antwort1
                if [ $antwort1 == "Yes" ];  
                        then
                        echo "Deine Antwort war Yes -> es geht in 5 Sekunden los! "  
                        sleep 5
                        else
                        echo "Deine Antwort war No -> Programm wird beendet! "  
                        exit
                fi
echo $'-------------------------> Der Kopiervorgang beginnt bei Ordner 1 und endet bei Ordner X. Bitte gib eine Zahl für X ein:'  
read endZahlSchleife
echo $'Okay, die TIFs der Unterordner 1 bis zum Unterordner' $endZahlSchleife  
echo $'werden jetzt jeweils eine Ordner-Ebene höher kopiert.'   
sleep 5
#find /Volumes/ELEMENTS/BereitzumScannenNimrod/3/ -name '*.tif' -mindepth 1 -type f -exec cp -i -v -a '{}' /Volumes/ELEMENTS/BereitzumScannenNimrod/3/ ';' 
	END=endZahlSchleife
		for ((i=1;i<=END;i++)); do
		find /Volumes/ELEMENTS/BereitzumScannenNimrod/$i/ -name '*.tif' -mindepth 1 -type f -exec cp -i -v -a '{}' /Volumes/ELEMENTS/BereitzumScannenNimrod/$i/ ';'  
		done
echo $''  
echo $'Vorletzter Schritt fertig! Die Bilddaten wurden aus den einzelnen Unterordnern im übergeordneten Ordner zusammengeführt.'  
echo $''  
echo $'-------------------------> ACHTUNG: Entscheide, ob JETZT alle Quelldaten-Unterordner ENTGÜLTIG gelöscht werden sollen -----> (Yes / No)'  
echo $'Diese Entscheidung bezieht sich auf Unterordner 1 bis Unterordner' $endZahlSchleife   
	read antwort2
		if [ $antwort2 == "Yes" ];  
			then
			echo "Deine Antwort war Yes -> es geht in 5 Sekunden los! "  
			sleep 5
			else
			echo "Deine Antwort war No -> Programm wird beendet! "  
			exit
		fi
        END=endZahlSchleife
                for ((i=1;i<=END;i++)); do
                find /Volumes/ELEMENTS/BereitzumScannenNimrod/$i/ -name '*01' -maxdepth 1 -type d -exec rm -r '{}' ';'  
                done
echo $''  
echo $'Die nicht mehr benötigten Unterordner mit den ursprünglichen Dateien wurden gelöscht.'  
echo $''  
echo $'Das Programm ist beendet.'  
echo $''  
Mitglied: 129813
Solution 129813 Aug 15, 2016 updated at 16:40:31 (UTC)
Goto Top
This should be enough for this task:
rootfolder="/path/zahlenordner"  
for f in $(find "$rootfolder" -mindepth 1 -maxdepth 1 -type d) ; do  
        # copy all tifs to the parent number folder
	find "$f" -type f -name *.tif  -exec mv '{}' "$f" \; >/dev/null  
        # remove dirs inside
	find "$f" -mindepth 1 -maxdepth 1 -type d -exec rm -rf '{}' \;  
done

screenshot

Regards
Member: tobatoba
tobatoba Aug 15, 2016 at 16:40:50 (UTC)
Goto Top
THX a lot ... slightly redundant, my piece of code face-wink