Bilder umbennen

Salzi

Prinzenapfel
Registriert
29.08.06
Beiträge
555
Hallo zusammen

Vorneweg erstmal: Dieses Thema hat nichts explizit mit Mac/Apple was zu tun. Ich weiss, dass dieses Thema evtl. in einem Linux Forum besser passen würde. Ich habe aber nicht die Lust mich in einem anderen Forum anzumelden wo man keinen kennt. Ich finde es hier sehr gemütlich und sympathisch. Darum möchte ich mein Glück erstmal hier versuchen. :) Ich bin auch nicht sicher, ob das Thema wirklich hier in den Unix Bereich gehört. Bitte verschieben, falls es falsch ist. Danke.

Ausgangslage:
Server: Debian Etch
Habe vollen Shell Zugriff, Root Rechte usw.

Darauf befinden sich 6 Ordner mit je rund 5000 Bilder. Diese haben alle das gleiche Problem: Sie habe keine Dateiendung. Im HTML eingebettet ist es kein Problem die Bilder anzuzeigen, weil der Browser (vorsicht halbwissen) weiss um welches Format es sich handelt. Die Bilder sind entweder jpg, png oder gif's.

Zu je 2 Ordner gehört eine Tabelle in einer Datenbank, welche in einigen Feldern diese Bilder (deren Namen übrigends 100% eindeutig sind) beinhalten.

Was ich möchte:
Ich möchte nun jedes Bild automatisch umbennen lassen und zwar je nachdem welcher Typ das Bild hat. Zudem soll der Name des Bildes in der Datenbank (bzw. von mir aus auch in der entsprechenden Datei der Datenbank) gesucht werden und ebenfalls entsprechend angepasst werden.

Rein theoretisch würde das ganze über PHP realisierbar sein. Allerdings gibt es ja den berühmten 30 sec timeout - den ich theoretisch erhöhen könnte aber eigentlich nicht möchte. Darum müsste ich das Script immer wieder neu aufrufen lassen nach 29 Sek. usw. was alles recht aufwändig ist.

Ich dachte mir wenn ich schon Root Zugang zum Server habe, könnte man das evtl. mit einem kleinen Serverscript machen. Dies würde bestimmt schneller gehen und auch ohne Veränderung an der Server konfiguration.

Meine Fragen:
-Kann man sowas per Serverscript machen (umbennen an und für sich sollte ja kein Problem sein aber kann man feststellen von welchem Bildtyp ein Bild ist -php kann das ja mit getimagesize
-Falls man es kann könnt ihr bitte ein paar Befehle nennen mit denen ich arbeiten muss damit mich anhand dessen per google informieren kann (Ich erwarte kein fertiges Script (was natürlich auch schön wäre :-D) ich möchte nur das ihr mir nen Wink in dir richtige Richtung gebt.)
-Hat jemand eine tolle andere Idee wie ich das Problem lösen könnte?

Besten Dank für alle hilfreichen Infos im Voraus

Gruss

Salzi
 

quarx

Brauner Matapfel
Registriert
17.04.05
Beiträge
8.444
Hast Du ImageMagick installiert? Dann schau Dir mal
Code:
man identify
an. Um dessen Ausgabe müsste man nur ein kurzes (sed/perl/...)-Skript drumrumpacken und fertig. ;)

Ein Beispiel im Terminal:
Code:
meinmac:~/test user$ identify werbinich
werbinich PNG 892x450 892x450+0+0 DirectClass 158.684kb 
meinmac:~/test user$
 
  • Like
Reaktionen: Salzi

Salzi

Prinzenapfel
Registriert
29.08.06
Beiträge
555
Jawohl ImageMagick ist installiert. Vielen Dank für den Tipp werde nun etwas testen :D

Gruss
 

Dr. Koffein

Empire
Registriert
19.01.05
Beiträge
89
Python-Skript

Hallo Salzi,

das folgende Skript sollte das gewünschte leisten. Ich hoffe, auf dem Server ist Python installiert :)
Code:
#! /usr/bin/env python

import os, sys

def renameFile(arg, d, files):
	filetypes = ['jpeg', 'png', 'gif']
	
	for file in files:
		ext = os.popen("identify -format %m \"" + d + "/" + file + "\"").read().lower().strip()
		if ext in filetypes:
			if ext == 'jpeg':
				ext = 'jpg'
			if not (file.endswith(ext)):
				os.popen("mv \"" + d + "/" + file + "\"" + " \"" + d + "/" + file + "." + ext + "\"")
	
	
def main():
	try:
		root = sys.argv[1]
	except:
		root = '.'
	os.path.walk(root, renameFile, None)
	
	
if __name__ == '__main__':
	main()

Bei Fragen kannst Du Dich gerne melden. Ich hoffe, ich konnte Dir damit helfen.
In dem Directory in dem Du das Skript ausführst wird dann rekursiv gestartet. Wenn Du ein anderes Directory angeben willst, gib die als erstes Argument bei der Ausführung an.
Dank an quarx für den Tip mit identify.
Viele Grüße,
drk
 
  • Like
Reaktionen: Salzi

Salzi

Prinzenapfel
Registriert
29.08.06
Beiträge
555
Hallo drk

Coole Sache funktioniert einwandfrei. Perfekt vielen Dank.
Das ganze löst schon einmal ein Problem das ich hatte. Das andere war ja, in einer Datenbank nach dem Namen zu suchen und diesen durch den neuen zu ersetzten? In php würde das ganze ja per str_replace wenig Probleme bereiten. Gibts sowas in bash / Python oder was auch immer?

Gruss

Salzi
 

quarx

Brauner Matapfel
Registriert
17.04.05
Beiträge
8.444
... dann brauch ich wohl keine Lösung mehr zu posten. :)
 

Salzi

Prinzenapfel
Registriert
29.08.06
Beiträge
555
@quarx: Danke für deine Arbeit. Hoffe hattest nicht zu viele Umstände deswegen.

So ich habe mich jetzt mal versucht mich etwas in Python einzulesen. Allerdings scheitere ich schon am ersten Script.
Experimentell wollte ich ein search & replace machen. Zum testen ganz einfach ohne Datei öffnen usw. Das ganze sieht dann so aus:

Code:
#!/usr/bin/python
import re
zu_verlinkender_text = """
[bild_text][link]28_0[bild]http://www.dexgo.net/hardware/Bilder/thumb/28_0[/bild][/link][text]
"""
Def verlinken(text):
   while 1:
      ort = re.search ('28_0', text)
           if ort == None:
               break
       zu_ersetzen = ort.group()
       code="28_0.jpg"
       text = re.sub(zu_ersetzen, code, text)
   return text
verlinkter_text = verlinken(zu_verlinkender_text)
print verlinkter_text
Wie unschwer zu erkennen habe ich versucht ein bestehendes Script abzuändern, was ich im Netz gefunden habe. Ich denke das Ziel ist klar. Ich will im oberen String (zu_verlinkender_text) alle 28_0 durch 28_0.jpg ersetzten. Dies liefert aber folgenden Fehler:

Code:
 File "rename", line 6
    Def verlinken(text):
                ^
SyntaxError: invalid syntax
Der Pfeil (falls man es nicht oder falsch sieht ist eingeltich bei der Klammer bzw. beim n davor.

Kann mir jemand verraten was daran nicht stimmt?

Gruss und Danke

Salzi

Edit: habe es eben auch mit einem etwas weniger waghalsigen versuch versucht und nur per string.replace das ersetzten durchgeführt. Allerdings selbes ergebnis
 
Zuletzt bearbeitet:

Salzi

Prinzenapfel
Registriert
29.08.06
Beiträge
555
Hallo

Leider auch ohne Erfolg :(

Code:
#! /usr/bin/env python

import re
zu_verlinkender_text = """
[bild_text][link]28_0[bild]http://www.dexgo.net/hardware/Bilder/thumb/28_0[/bild][/link][text]
"""
def verlinken(text):
   while 1:
      ort = re.search ('28_0', text)
           if ort == None:
               break
       zu_ersetzen = ort.group()
       code="28_0.jpg"
       text = re.sub(zu_ersetzen, code, text)
   return text
verlinkter_text = verlinken(zu_verlinkender_text)
print verlinkter_text

bringt:

Code:
  File "rename", line 10
    if ort == None:
    ^
SyntaxError: invalid syntax
 

quarx

Brauner Matapfel
Registriert
17.04.05
Beiträge
8.444
Sind die Bildnamen eindeutig oder gibt es Duplikate? Könnte man das auch mit einem Perl-Skript angehen?
 

Salzi

Prinzenapfel
Registriert
29.08.06
Beiträge
555
Jedes Bild kommt genau doppelt darin vor.
Der Aufbau ist genau wie oben in meinem Beispiel (das zu_verlinkender_text).

Gruss
 

pepi

Cellini
Registriert
03.09.05
Beiträge
8.740
/usr/bin/file
kann Dir auch den Datentyp anzeigen lassen und kommt ohne Imagemagick aus. Mit einer Schleife sollte es eigentlich getan sein.
Gruß Pepi
 

Skeeve

Pomme d'or
Registriert
26.10.05
Beiträge
3.120
Mit einer Schleife sollte es eigentlich getan sein.

Und was machst Du in der Schleife? "file" zeigt Dir den Typ an, nicht die default extension. Von daher mußt Du also zu jedem möglichen Typ noch eine passende Extension finden. Also ein "case" gehört mindestens noch mit da rein.
 

pepi

Cellini
Registriert
03.09.05
Beiträge
8.740
Wenn man unfein ist, kann man den Typ gleich als Extension hernehmen, sofern es einen nicht stört, daß JPEGs dann eben .jpeg heissen anstatt dem gebräuchlicheren .jpg. (LowerCase conversion per sed oder awk gepiped). Quasi die für diesen Fall halbwegs brauchbare Quick-And-Dirty Lösung. Ich gebe aber zu, daß ein case natürlich die elegantere und flexiblere Lösung ist die man anstreben sollte.
Gruß Pepi
 

Dr. Koffein

Empire
Registriert
19.01.05
Beiträge
89
Hallo Salzi,

folgendes Skript sollte das gewünschte leisten:


Code:
#!/usr/bin/python

def verlinken(text, bild, extension):
	return(text.replace(bild, bild + "." + extension))

zu_verlinkender_text = """[bild_text][link]28_0[bild]http://www.dexgo.net/hardware/Bilder/thumb/28_0[/bild][/link][text]"""
verlinkter_text = verlinken(zu_verlinkender_text, "28_0", "jpg")
print verlinkter_text
 

quarx

Brauner Matapfel
Registriert
17.04.05
Beiträge
8.444
Das wäre denn meine (nicht gepostetete) Shell-Lösung gewesen: Typ der Datei mit
Code:
identify Bildname
oder meinetwegen
Code:
file Bildname
ermitteln, den Typ herausschneiden mit
Code:
file Bildname | cut -f2 -d ' '
ggf. noch in Kleinschreibung umwandeln
Code:
file Bildname | cut -f2 -d ' ' | tr '[A-Z]' '[a-z]'
und das Endergebnis an den fraglichen Dateinamen anhängen. Je nach Tagesform auch mit sed. :innocent:
 

quarx

Brauner Matapfel
Registriert
17.04.05
Beiträge
8.444
Schlägt in dem Moment fehl, in dem der Dateiname ein Space enthält.
Eine andere Lösung wäre, gleich bloß den Typ der Datei zu ermitteln und das dann weiter zu verarbeiten:
Code:
identify -format "%m" Bildname
 

Dr. Koffein

Empire
Registriert
19.01.05
Beiträge
89
Mit folgendem Befehl müsste es dann hinhauen:

Code:
for file in *; do EXTENSION=`identify -format %m $file | tr [A-Z] [a-z] | sed 's/jpeg/jpg/'`; mv $file "`echo $file.$EXTENSION`"; done

Allerdings berücksichtigt diese Version nicht, dass eventuell die Extension schon vorhanden ist. In diesem Fall wird eine zweite Extension angehängt.
 

Salzi

Prinzenapfel
Registriert
29.08.06
Beiträge
555
Hallo Salzi,

folgendes Skript sollte das gewünschte leisten:


Code:
#!/usr/bin/python

def verlinken(text, bild, extension):
    return(text.replace(bild, bild + "." + extension))

zu_verlinkender_text = """[bild_text][link]28_0[bild]http://www.dexgo.net/hardware/Bilder/thumb/28_0[/bild][/link][text]"""
verlinkter_text = verlinken(zu_verlinkender_text, "28_0", "jpg")
print verlinkter_text

Super klasse funktioniert wirkliche einwandfrei, Ich versuche mich jetzt mal mit mit dem öffnen, editieren und schliessen von Dateien. Dann bastle ich noch alle 3 irgendwie zusammen und dann bin ich über glücklich ^^
Ich werde berichten wie ich voran komme.

@Danke auch den anderen für ihre Inputs nur versteh ich kaum was von der Diskusion ;)

Gruss

Salzi