dummkopf2
Anmeldungsdatum: 6. Oktober 2010
Beiträge: 187
|
Hi, ich komme nicht weiter beim "automatischeren" Sortieren meiner Fotosammlung. Undzwar folgende Situation:
ich habe gleiche Fotos als .cr2/CR2 (Rohdateien) und als .jpg/JPG (entwickelte Dateien) in verschiedenen Ordnern (aber einem Überordner), die Dateinamen sind außer den Endungen identisch. Ich habe die Bilder im jpg Ordner aussortiert. D.h. ich habe jetzt im cr2 Ordner noch alle Bilder, die nichts geworden sind. Die sollen weg. Ich bräuchte also ein kleines Skript, dass:
in den 2 Ordnern und Unterordnern schaut, welche Dateien den gleichen Namen (bei Ignorieren der Endung) haben alle überschüssigen cr2/CR2 löscht (aber nicht die überschüssigen jpg)
Bekommt das hier jemand hin? Vielen Dank im Voraus!
Eric Bearbeitet von rklm: Formatierung. Du bist schon eine Weile hier, bitte nutze die Möglichkeiten der Forum/Syntax!
|
unbuntuS12
Anmeldungsdatum: 2. Juni 2010
Beiträge: 1816
|
Bitte gib mal ein paar Beispieldaten, nicht nur Beschreibungen. Also einmal in die entsprechenden Ordner gehen und jeweils per ls zeigen, was aktuell vorhanden ist und was dann später vorhanden sein sollte.
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Hallo! Ein kleines Testbeispiel: schiggn@desktop:~$ mkdir test
schiggn@desktop:~$ for i in {1..10}; do touch "test/Datei$i.endung1"; touch "test/Datei$i.endung2"; done
schiggn@desktop:~$ ls test
Datei10.endung1 Datei1.endung2 Datei3.endung1 Datei4.endung2 Datei6.endung1 Datei7.endung2 Datei9.endung1
Datei10.endung2 Datei2.endung1 Datei3.endung2 Datei5.endung1 Datei6.endung2 Datei8.endung1 Datei9.endung2
Datei1.endung1 Datei2.endung2 Datei4.endung1 Datei5.endung2 Datei7.endung1 Datei8.endung2
schiggn@desktop:~$ for file in test/*endung1; do echo ${file%.endung1}.endung2; done
test/Datei10.endung2
test/Datei1.endung2
test/Datei2.endung2
test/Datei3.endung2
test/Datei4.endung2
test/Datei5.endung2
test/Datei6.endung2
test/Datei7.endung2
test/Datei8.endung2
test/Datei9.endung2
schiggn@desktop:~$
Du könntest nun anstatt dem echo ein rm verwenden.
|
dummkopf2
(Themenstarter)
Anmeldungsdatum: 6. Oktober 2010
Beiträge: 187
|
unbuntuS12 schrieb: Bitte gib mal ein paar Beispieldaten, nicht nur Beschreibungen. Also einmal in die entsprechenden Ordner gehen und jeweils per ls zeigen, was aktuell vorhanden ist und was dann später vorhanden sein sollte.
Also doch noch kurz eine Erklärung:
folgende Ordnerstruktur
und jetzt der Inhalt von Tag 1 bei JPG:
07.24_15h28m45s.jpg 07.24_16h13m40s.jpg 07.24_22h48m44s.jpg
07.24_15h29m15s.jpg 07.24_16h21m01s.jpg 07.24_22h54m46s.jpg
07.24_15h29m32s.JPG 07.24_16h39m26s.jpg 07.24_22h57m41s.jpg
07.24_15h29m42s.jpg 07.24_16h51m35s.jpg 07.24_23h04m52s.jpg
07.24_16h01m27s.jpg 07.24_18h01m52s.jpg 07.24_23h13m45s.jpg
07.24_16h01m44s.jpg 07.24_18h02m33s.jpg 07.24_23h14m52s.jpg
07.24_16h09m02s.JPG 07.24_19h50m37s.jpg 07.24_23h15m01s.jpg
07.24_16h09m12s.jpg 07.24_21h22m55s.jpg 07.24_23h42m27s-exp_03.jpg und RAW
07.24_15h28m45s.CR2 07.24_18h02m33s.CR2 07.24_23h00m31s.CR2
07.24_15h29m15s.CR2 07.24_22h40m44s.CR2 07.24_23h04m52s.CR2
07.24_15h29m32s.CR2 07.24_22h40m48s.CR2 07.24_23h04m59s.CR2
07.24_15h29m42s.CR2 07.24_22h40m53s.CR2 07.24_23h07m10s.CR2
07.24_16h01m27s.CR2 07.24_22h40m57s.CR2 07.24_23h08m51s.CR2
07.24_16h01m44s.cr2 07.24_22h41m01s.CR2 07.24_23h10m44s.CR2
07.24_16h09m02s.CR2 07.24_22h41m05s.CR2 07.24_23h13m45s.CR2
07.24_16h09m12s.CR2 07.24_22h41m09s.CR2 07.24_23h14m52s.CR2
07.24_16h13m40s.CR2 07.24_22h41m13s.CR2 07.24_23h15m01s.CR2
07.24_16h21m01s.CR2 07.24_22h48m44s.cr2 07.24_23h35m17s.CR2
07.24_16h21m01sJPG 07.24_22h54m46s.CR2 07.24_23h42m27s.CR2
07.24_16h39m26s.CR2 07.24_22h57m41s.CR2 07.24_23h42m27s.CR2.xmp
07.24_18h01m52s.CR2 07.24_23.42..CR2.xmp dabei fällt mir ein, dass die xmp nie angefasst werden sollten. Es wäre gut, wenn es sowohl Klein- und Großschreibung als eins ansieht, wenn das zu schwierig ist, kann ich die Dateien auch umbenennen ☺ Die Schritte von ChickenLipsRfun2eat haben leider nur ein paar Dateien angelegt, aber nix gelöscht. Liegt aber vermutlich an meiner schlechten Schilderung ¯\_(ツ)_/¯ EDIT: die Dateien, die ....-exp_Nummer heißen, werde ich wohl noch umbenennen müssen 😛
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
ChickenLipsRfun2eat schrieb: Du könntest nun anstatt dem echo ein rm verwenden.
echo löscht glücklicherweise auch nix ☺
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17548
Wohnort: Berlin
|
Du willst alle Dateien in der Substruktur 1 löschen, für die es kein Gegenstück in Struktur 1 gibt, habe ich verstanden. Unklar ist mir noch, ob die Unterordner zusammenpassen, sieht aber so aus.
|
dummkopf2
(Themenstarter)
Anmeldungsdatum: 6. Oktober 2010
Beiträge: 187
|
Ich hatte die Ordner schon eingesetzt und rm statt echo eingefügt 😉
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
for file in JPG/*.jpg; do rm "${RAW/file%.jpg}.CR2"; done aufgerufen aus dem Ordner "Urlaub" funktioniert nicht?
|
dummkopf2
(Themenstarter)
Anmeldungsdatum: 6. Oktober 2010
Beiträge: 187
|
ChickenLipsRfun2eat schrieb: for file in JPG/*.jpg; do rm "${RAW/file%.jpg}.CR2"; done aufgerufen aus dem Ordner "Urlaub" funktioniert nicht?
nein, das spuckt mehrmals
"rm: das Entfernen von '.CR2' ist nicht möglich: Datei oder Verzeichnis nicht gefunden"
aus.
Würde das nicht außerdem alle Dateien, zu denen es ein Gegenstück gibt löschen, statt andersherum? user_unknown schrieb: Du willst alle Dateien in der Substruktur 1 löschen, für die es kein Gegenstück in Struktur 1 gibt, habe ich verstanden. Unklar ist mir noch, ob die Unterordner zusammenpassen, sieht aber so aus.
Genau, wenn es kein .jpg mehr gibt soll auch das dazugehörige .cr2 gelöscht werden, sonst nichts geschehen. Und ja, die Unterordner tragen jeweils unter Urlaub/JPG als auch unter Urlaub/RAW jeweils das Datum als Namen.
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Verstehe ich Dich recht mit dieser Logik ? :
gehe alle *.CR2 (und *.cr2) - Dateien durch und gucke für jede Datei nach, ob es für sie ein Gegenstück *.jpg / *.JPG gibt. Wenn nicht, lösche die Datei
Das ginge z.B, mit so einem Code: | cd Urlaub/RAW
for file in *.[Cc][Rr]2; do
if [ -f "../JPG/${file%.*}.JPG" ] ; then
continue
elif [ -f "../JPG/${file%.*}.jpg" ] ; then
continue
fi
echo rm "$file"
|
LG, track
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
dummkopf2 schrieb: Würde das nicht außerdem alle Dateien, zu denen es ein Gegenstück gibt löschen, statt andersherum?
Ja. Da habe ich deine Anforderung falsch verstanden. Ich dachte du wolltest den aussortierten Ordner (der die unerwünschten enthält) abgleichen.
|
dummkopf2
(Themenstarter)
Anmeldungsdatum: 6. Oktober 2010
Beiträge: 187
|
track schrieb: Verstehe ich Dich recht mit dieser Logik ? :
gehe alle *.CR2 (und *.cr2) - Dateien durch und gucke für jede Datei nach, ob es für sie ein Gegenstück *.jpg / *.JPG gibt. Wenn nicht, lösche die Datei
track
Genau so! Der Code funktioniert auch soweit. Vielen Dank! Ich habe noch eine Bedingung hinzugefügt (wenn es unter RAW eine Datei "Dateiname.cr2.xmp" gibt, dann lösche auch nix):
1
2
3
4
5
6
7
8
9
10
11
12
13 | #!/bin/bash
cd /media/Daten/Bilder/2016/Urlaub/RAW
for file in *.[Cc][Rr]2; do
if [ -f "../JPG/${file%.*}.JPG" ] ; then
continue
elif [ -f "../JPG/$subdir/${file%.*}.jpg" ] ; then
continue
fi
if [ -f "../RAW/${file}.xmp" ] ; then
continue
fi
rm "$file" ; done
|
Jetzt gibt es nur noch ein Problem: in den Ordnern RAW und JPG gibt es noch Subordner, die er durchsuchen soll (sie heißen auf beiden Seiten gleich).
Kann ich das Skript alle Unterordner durchsuchen lassen? (Ohne ihm jedes Ordnerpaar selbst angeben zu müssen? ChickenLipsRfun2eat schrieb: Ja. Da habe ich deine Anforderung falsch verstanden. Ich dachte du wolltest den aussortierten Ordner (der die unerwünschten enthält) abgleichen.
Nicht schlimm, trotzdem vielen Dank! Du hast mir hier auch schon oft genug geholfen 😀
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Sicherlich kann man auch Subordner durchsuchen. Entweder mit for file in */ *.[Cc][Rr]2; do oder, wenn es allgemeiner sein soll, mit find -iname cr2 -exec .... {} \; (wobei die "...." für Deinen Schleifeninhalt, aber in einer Subshell, stehen). Der Haken ist dann aber, dass der dazugehörige RAW- Ordner nicht mehr so einfach mit einem einfachen ../RAW zu benennen ist. Du wirst Dir also die Umwandlungsanleitung genauer überlegen müssen. (Das geht sicherlich mit ein paar Process Substitutions - musst Du Dir also mal gut durchlesen und was zusammenbasteln. Wichtig ist dabei, dass Du sauber schrittweise vorgehst: zuerst alle relevanten Dateien finden, und dann dafür die Umformungsausdrücke erstellen. LG, track
|
dummkopf2
(Themenstarter)
Anmeldungsdatum: 6. Oktober 2010
Beiträge: 187
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | #!/bin/bash
cd /media/Daten/Bilder/2016/Urlaub/RAW
for D in *; do find . -maxdepth 1 -mindepth 1 -type d -printf "$D\n"
for file in "$D"/*.[Cc][Rr]2; do
s=${file}
file=${s##*/}
if [ -f "../JPG/${D}/${file%.*}.JPG" ] ; then
continue
elif [ -f "../JPG/${D}/${file%.*}.jpg" ] ; then
continue
fi
if [ -f "../RAW/${D}/${file}.xmp" ] ; then
continue
fi
rm "$D/$file" ;
done ;
done
|
scheint an den Testdaten zu irgendwie zu funktionieren. Hat irgendwer noch etwas zu meckern, bevor ich es an den richtigen Dateien ausführe? 😬
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
... na ja, meckern ist gut ! # <🐸 Zuerst musste ich mal sortieren, von wo bis wo Deine Schleifen gehen. Du hattes nämlich etwas nach "Kraut und Rüben" eingerückt, und nicht konsequent für jede Schleife und Bedingungsabfrage jeweils um eine Ebene ... Das hilft doch etwas für die Übersicht, was zu welcher Schleife gehört: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | #!/bin/bash
cd /media/Daten/Bilder/2016/Urlaub/RAW
for D in *; do find . -maxdepth 1 -mindepth 1 -type d -printf "$D\n"
for file in "$D"/*.[Cc][Rr]2; do
s=${file}
file=${s##*/}
if [ -f "../JPG/${D}/${file%.*}.JPG" ] ; then
continue
elif [ -f "../JPG/${D}/${file%.*}.jpg" ] ; then
continue
fi
if [ -f "../RAW/${D}/${file}.xmp" ] ; then
continue
fi
rm "$D/$file"
done
done
|
Das find hinten in Zeile 4 hast Du nur zum testen eingebaut, nehme ich an ? Die Zeilen 6 und 7 könntest Du auch zusammenfassen: file=${file##*/} - wobei es im Sinne der Übersicht vielleicht sogar besser wäre, hier durchweg 2 unterschiedliche Variablennamen zu benutzen. An Deiner Stelle würde ich es einmal vorab mit einen echo vor dem rm auf den echten Daten testen. Dann siehst Du ja, was er tun würde: ob er alles korrekt erwischt und nicht zu viel löscht. Ansonsten, wenn es überall auf Deinen Daten funktioniert, ist das doch hervorragend ! LG, track
|