tobatoba
Goto Top

Regex mit find unter Bash 4.3.46 zum filtern und organisieren von unterordnern (Mac OS 10.11.6)

Hallo,

ich habe ein Problem mit dem Identifizieren von Unterordnern im meiner Ordnerstruktur und suche Hilfe.

Die Ordnerstruktur ist einfach unterteilt.
1. Ebene, Name: "Zahlenordner"
2. Ebene, Ordnernamen bestehen aus fortlaufenden Zahlen - ohne führende Null (ca. 1000 Ordner)
3. Ebene, Ordnernamen bestehen aus irgendwelchen Zahlen - mit mindestens einer führenden Null
Beispiel:
-> Zahlenordner
->-> 123
->->-> 0001
->->-> 0002
->->-> 0003
->-> 124
->->-> 0001
->->-> 0002
->->-> 0003

Mein letztliches Ziel ist es, die Dateien, welche die Ordner der 3. Ebene enthalten, in die 2. Ebene zu überführen und die Ordner der 3. Ebene zu löschen.
Dafür möchte ich die Ordner zuerst identifizieren, aber leider bekomme ich -regex über find in der Bash nicht zum laufen.
Einen Automator-Workflow gibt es schon, allerdings muss hier auch immer wieder händisch eingegriffen werden.
Ich würde am liebsten eine kleines Shellscript schreiben was meine Wünsche erfüllt. Leider scheitere ich bereits jetzt beim Thema Regex.

Ich arbeite unter Mac OS 10.11.6/ Bash 4.3.46.

Folgender Befehle stehen derzeit exemplarisch für mein Problem:

find -E /Users/thomas/Desktop -type d -regex '^[1-9][0-9]*$' -print
(Filtern der Ordner der 2. Ebene)

find -E /Users/thomas/Desktop -type d -regex '^0\d*$' -print
(Filtern der Ordner der 3. Ebene)

Ich bin mir eigentlich sicher sicher, dass der Regex-Ausdruck soweit okay ist ... (habe es aber auch schon mit anderen Ausdrücken testweise probiert) aber es funktioniert nicht.


Vielleicht hat hier ja jemand eine Idee?


Viele Grüße,
Thomas

Content-Key: 311485

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

Printed on: April 19, 2024 at 20:04 o'clock

Mitglied: 129813
Solution 129813 Aug 02, 2016 updated at 10:06:54 (UTC)
Goto Top
Hi, bash matches the whole path in the regex not only the name of the folder, so this regex should work:
'.*/0\d*$'

From the man page:
-regex pattern
       File name matches regular expression pattern.  This is a match on the whole path, not a search.  For example, to match a file named './fubar3',  you  can  use  the
       regular expression '.*bar.' or '.*b.*3', but not 'b.*r3'.

Regards
Member: tobatoba
tobatoba Aug 02, 2016 at 10:26:42 (UTC)
Goto Top
thanks a lot!
Member: tobatoba
tobatoba Aug 15, 2016 at 15:58:04 (UTC)
Goto Top
Meine Lösung sieht zwischenzeitlich 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 $''