1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Bilder umbennen

Dieses Thema im Forum "Unix & Terminal" wurde erstellt von Salzi, 05.01.08.

  1. Salzi

    Salzi Prinzenapfel

    Dabei seit:
    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
     
  2. quarx

    quarx Hadelner Sommerprinz

    Dabei seit:
    17.04.05
    Beiträge:
    8.541
    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$
     
    Salzi gefällt das.
  3. Salzi

    Salzi Prinzenapfel

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

    Gruss
     
  4. Dr. Koffein

    Dr. Koffein Empire

    Dabei seit:
    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
     
    Salzi gefällt das.
  5. Salzi

    Salzi Prinzenapfel

    Dabei seit:
    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
     
  6. quarx

    quarx Hadelner Sommerprinz

    Dabei seit:
    17.04.05
    Beiträge:
    8.541
    ... dann brauch ich wohl keine Lösung mehr zu posten. :)
     
  7. Salzi

    Salzi Prinzenapfel

    Dabei seit:
    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
     
    #7 Salzi, 05.01.08
    Zuletzt bearbeitet: 05.01.08
  8. Dr. Koffein

    Dr. Koffein Empire

    Dabei seit:
    19.01.05
    Beiträge:
    89
    Hallo Salzi, schreibe bitte "def" klein am Anfang. Ausserdem die if-Klausel selber nicht einrücken, sondern nur was innerhalb der if-Klausel steht muss eingerückt werden.

    Gruß,
    drk
     
  9. Salzi

    Salzi Prinzenapfel

    Dabei seit:
    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
     
  10. quarx

    quarx Hadelner Sommerprinz

    Dabei seit:
    17.04.05
    Beiträge:
    8.541
    Sind die Bildnamen eindeutig oder gibt es Duplikate? Könnte man das auch mit einem Perl-Skript angehen?
     
  11. Salzi

    Salzi Prinzenapfel

    Dabei seit:
    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
     
  12. pepi

    pepi Cellini

    Dabei seit:
    03.09.05
    Beiträge:
    8.741
    /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
     
  13. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121

    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.
     
  14. pepi

    pepi Cellini

    Dabei seit:
    03.09.05
    Beiträge:
    8.741
    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
     
  15. Dr. Koffein

    Dr. Koffein Empire

    Dabei seit:
    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
    
     
  16. quarx

    quarx Hadelner Sommerprinz

    Dabei seit:
    17.04.05
    Beiträge:
    8.541
    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:
     
  17. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    Schlägt in dem Moment fehl, in dem der Dateiname ein Space enthält.

    P.S. Läßt sich wohl lösen mit
    Code:
    cat "Bildname" | file - | cut -f2 -d ' '
     
  18. quarx

    quarx Hadelner Sommerprinz

    Dabei seit:
    17.04.05
    Beiträge:
    8.541
    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
     
  19. Dr. Koffein

    Dr. Koffein Empire

    Dabei seit:
    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.
     
  20. Salzi

    Salzi Prinzenapfel

    Dabei seit:
    29.08.06
    Beiträge:
    555
    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
     

Diese Seite empfehlen