ubuntuusers.de

RAF-Dateien ohne zugehöriges JPG löschen

Status: Gelöst | Ubuntu-Version: Ubuntu 13.10 (Saucy Salamander)
Antworten |

Roland_Linux

Avatar von Roland_Linux

Anmeldungsdatum:
6. Februar 2006

Beiträge: 2396

Hallo,

in meinem Bilderordner habe ich Bilder (.JPG) und Rohdateien (.RAF) liegen. Die Bilder als auch die Rohdateien haben den gleichen Dateinamen und unterscheiden sich nur an der Endung. Nun möchte ich ein kleines Skript schreiben, dass überprüft, welche JPGs in dem Ordner liegen und alle RAFs ohne zugehöriges JPG löscht.

Leider komme ich nicht recht weiter. Ich denke, dass hierzu eine Schleife sinnvoll ist, aber ich weiß nicht recht, wie ich das Problem anpacken soll. Vielleicht konnt ihr mir hier weiterhelfen. Vielen Dank im Voraus.

mrkramps Team-Icon

Avatar von mrkramps

Anmeldungsdatum:
10. Oktober 2006

Beiträge: 5523

Wohnort: south central EL

Teste das folgende Script erst in einem Sandkasten! Falls da was nicht so läuft, wie ich mir das gerade vorstelle, möchte ich nicht verantwortlich für das versehentliche Löschen deiner Daten sein.

Das Script muss innerhalb des Bildverzeichnisse liegen und ausgeführt werden.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/bin/bash
for rohdatei in *.RAF
do
    # Überprüfe ob keine JPG mit gleichen Namen existiert ...
    if [ ! -f "${rohdatei%%.*}".JPG ]
    then
        # ... falls keine JPG existiert, lösche die Rohdatei.
        rm "$rohdatei"
    fi
done

Das Ganze lässt sich auch einfach als einzeiliger Befehl im Verzeichnis ausführen:

for rohdatei in *.RAF; do if [ ! -f "${rohdatei%%.*}".JPG ]; then rm "$rohdatei"; fi; done 

Roland_Linux

(Themenstarter)
Avatar von Roland_Linux

Anmeldungsdatum:
6. Februar 2006

Beiträge: 2396

Super, vielen Dank für die Antwort. Es funktioniert. Könntest du mir bitte den folgenden Teil erklären:

if [ ! -f "${rohdatei%%.*}".JPG ]

Der Rest (for-Schleife, if, then, ...) ist mir klar.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11260

Wohnort: München

Roland_Linux schrieb:

Super, vielen Dank für die Antwort. Es funktioniert. Könntest du mir bitte den folgenden Teil erklären:

if [ ! -f "${rohdatei%%.*}".JPG ]

Wenn keine Datei rohdatei.JPG existiert dann...

Das %%.* schneidet den größten Treffer für .* ab, siehe z.B. Bash Reference Manual: http://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html#Shell-Parameter-Expansion

${parameter%word}
${parameter%%word} 

The word is expanded to produce a pattern just as in filename expansion. If the pattern matches a trailing portion of the expanded value of parameter, then the result of the expansion is the value of parameter with the shortest matching pattern (the ‘%’ case) or the longest matching pattern (the ‘%%’ case) deleted. If parameter is ‘@’ or ‘*’, the pattern removal operation is applied to each positional parameter in turn, and the expansion is the resultant list. If parameter is an array variable subscripted with ‘@’ or ‘*’, the pattern removal operation is applied to each member of the array in turn, and the expansion is the resultant list.

Beispiel:

1
2
3
4
5
a="this.is.a.test.txt"
echo ${a%.*}
this.is.a.test
echo ${a%%.*}
this

mrkramps Team-Icon

Avatar von mrkramps

Anmeldungsdatum:
10. Oktober 2006

Beiträge: 5523

Wohnort: south central EL

Wenn [ nicht (!) Datei existiert (-f), die übergeben in Variabel (${rohdatei ...) ohne Dateiendung .RAF (... %%.*}) aber mit Dateiendung .JPG (.JPG) ].

Eine if-Abfrage überprüft mit -f DATEI, ob eine Datei existiert. Diese Abfrage wird mit vorangestelltem ! umgekehrt - also wird überprüft, ob DATEI nicht exisitiert. Siehe auch File test operators 🇬🇧 und Introduction to if 🇬🇧.

Die for-Schleife läuft über die RAF-Dateien, die in deinem Fall - sofern keine JPG exisistiert - gelöscht werden sollen. Da die Dateinamen identisch sind aber die Dateiendungen nicht, wird mit der sogenannten Parameter Substitution 🇬🇧 die Dateiendung (alles nach dem Punkt entfernt) - man könnte in diesem Fall auch ${rohdatei%%.RAF} verwenden - und mit dem .JPG einfach für die if-Abfrage die Dateiendung für die tatsächlich zu überprüfenden Bilddateien an die Zeichenkette gehängt.

Sollte das etwas verwirrend sein, dann liegt das gerade daran, dass ich nur noch 5 Minuten habe um meinen Arbeitsplatz zu räumen! 😬

Roland_Linux

(Themenstarter)
Avatar von Roland_Linux

Anmeldungsdatum:
6. Februar 2006

Beiträge: 2396

Vielen Dank für die Erklärung. Ich glaube, dass ich es einigermaßen kapiert habe.

Antworten |