Anzeige:
Ergebnis 1 bis 9 von 9

Thema: Erster Bash-Skript Versuch: Rekursiv nach XML-Dateien suchen und Inhalt ändern

  1. #1
    Registrierter Benutzer
    Registriert seit
    Oct 2015
    Beiträge
    4

    Erster Bash-Skript Versuch: Rekursiv nach XML-Dateien suchen und Inhalt ändern

    Hallo!

    Ich bin neu hier und habe mich angemeldet, weil ich mich gerade an meinem ersten kleinen Skript versuche.

    Der Hintergrund: Ich habe meine Fotosammlung neu sortiert, was dazu führt, dass die aus der RAW-Entwicklung stammenden ID-Files (*.ufraw) ihr zugehöriges RAW-Original nicht mehr finden, weil dieses in ihnen als XML-Node in absoluter Pfadangabe gespeichert ist. Das Skript soll alle Unterverzeichnisse nach *.ufraw durchsuchen, den Namen der Originaldatei (P*******.RAW) in eine Variable speichern, und die dritte Zeile (<InputFilename>) mit einem relativen Pfad neu schreiben.

    Dafür fehlen mir zum einen der Befehl, wie ich eine Schleife durch die Unterverzeichnisse laufen lassen kann, die nach *.ufraw sucht, und zum anderen die genaue Beschreibung von xmlstarlet - alles was ich finde ist auf Englisch, und die Sache bereitet mir so schon genug Knoten im Kopf, sodass ich mit einer deutschen Erklärung wahrscheinlich schneller am Ziel wäre.

  2. #2
    Universaldilletant Avatar von fork
    Registriert seit
    Dec 2001
    Ort
    Frankfurt/Main
    Beiträge
    1.175
    Dafür fehlen mir zum einen der Befehl, wie ich eine Schleife durch die Unterverzeichnisse laufen lassen kann, die nach *.ufraw sucht,
    Z. B.

    Code:
    find /pfad -iname "*.ufraw" | while read my_file; do
       # in my_file steht der Dateiname drin
    done
    und zum anderen die genaue Beschreibung von xmlstarlet - alles was ich finde ist auf Englisch, und die Sache bereitet mir so schon genug Knoten im Kopf, sodass ich mit einer deutschen Erklärung wahrscheinlich schneller am Ziel wäre.
    Das ist leider bei vielen Softwarepaketen der Fall. Ich fürchte, Du wirst Dich mit der englischen Doku zurechtfinden müssen.

    Zeig Mal ein Beispiel einer XML-Datei(In Code Tags bitte). Vielleicht muss man die auch nicht unbedingt parsen.
    Geändert von fork (11.10.15 um 19:14 Uhr)

  3. #3
    Registrierter Benutzer
    Registriert seit
    Oct 2015
    Beiträge
    4
    Hallo und danke!

    Zitat Zitat von fork Beitrag anzeigen
    Das ist leider bei vielen Softwarepaketen der Fall. Ich fürchte, Du wirst Dich mit der englischen Doku zurechtfinden müssen.
    Vielleicht ist hier trotzdem jemand, der sowas aus dem Kopf kann?

    Zitat Zitat von fork Beitrag anzeigen
    Zeig Mal ein Beispiel einer XML-Datei(In Code Tags bitte). Vielleicht muss man die auch nicht unbedingt parsen.
    Das ist z.B. so eine Datei. Mein Plan ist, die dritte Zeile in einen String zu schreiben, dann die Zeichen zwischen den letzten 28 und 20 Zeichen (nur das P*******) in die Variable "Name". Daraus soll dann die neue Zeile generiert werden mit ../Raw/$Originalname.RAW

    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <UFRaw Version='7'>
    <InputFilename>/media/Benutzer/Fotos/2015-Mallorca/P1090370.RAW</InputFilename>
    <OutputFilename>/media/Benutzer/Fotos/2015-Mallorca/RAW/beach02.tif</OutputFilename>
      <WB>Manual WB</WB>
      <WBFineTuning>0</WBFineTuning>
      <Temperature>6542</Temperature>
      <Green>0.943</Green>
      <ChannelMultipliers>2.7176 1.0000 1.4142 1.0000</ChannelMultipliers>
    <Contrast>1.308311</Contrast>
    <Exposure>-0.729970</Exposure>
    <Saturation>0.815013</Saturation>
    <Shrink>3</Shrink>
    <OutputType>2</OutputType>
    <CreateID>1</CreateID>
    <BaseManualCurve Current='yes'>
    	<AnchorXY>0.000000 0.000000</AnchorXY>
    	<AnchorXY>0.392157 0.549738</AnchorXY>
    	<AnchorXY>1.000000 1.000000</AnchorXY>
    </BaseManualCurve>
    <ManualCurve Current='yes'>
    	<AnchorXY>0.003311 0.000000</AnchorXY>
    	<AnchorXY>0.258824 0.219895</AnchorXY>
    	<AnchorXY>0.745098 0.811518</AnchorXY>
    	<AnchorXY>1.000000 1.000000</AnchorXY>
    </ManualCurve>
    <MatrixInputProfile Current='yes'>Color matrix
    	<Gamma>0.372156</Gamma>
    	<Linearity>0.017964</Linearity>
    </MatrixInputProfile>
    <sRGBOutputProfile Current='yes'>sRGB
    	<BitDepth>16</BitDepth>
    </sRGBOutputProfile>
    <Make>Panasonic</Make>
    <Model>DMC-FZ50</Model>
    <Timestamp>Mon Sep 21 15:18:48 2015</Timestamp>
    <Orientation>0</Orientation>
    <ISOSpeed></ISOSpeed>
    <Shutter>1/500 s</Shutter>
    <Aperture>F8</Aperture>
    <FocalLength>7.4 mm</FocalLength>
    <FocalLength35></FocalLength35>
    <EXIFSource>exiv2 0.23</EXIFSource>
    <Crop>0 0 3672 2748</Crop>
    <AspectRatio>1.336245</AspectRatio>
    <Rotation>0.000000</Rotation>
    <Log>
    ufraw_open: w:3672 h:2748 curvesize:0
    EXIF data read using exiv2, buflen 256
    
    Scaling with darkness 0, saturation 4095, and
    multipliers 1,000000 0,514677 0,837573 0,514677
    Loading Panasonic DMC-FZ50 image from /media/BENUTZER/Fotos/2015-Mallorca/RAW/P1090370.RAW ...
    Black: 0, Maximum: 4095
    
    </Log>
    </UFRaw>

  4. #4
    Banned
    Registriert seit
    Feb 2005
    Beiträge
    1.151
    Da braucht es auch kein xmlstarlet. Da reicht
    Code:
    echo $( basename $( xml_grep --text_only InputFilename pic.xml ) .RAW )
    xml_grep ist bei mir Teil des Paketes perl-XML-Twig-3.44-2.1.2.noarch. Wird bei dir wohl ein wenig anders heißen.

    pic.xml musst halt anpassen.

  5. #5
    Universaldilletant Avatar von fork
    Registriert seit
    Dec 2001
    Ort
    Frankfurt/Main
    Beiträge
    1.175
    Weil's mir gerade in den Weg gesprungen ist: xmlstarlet und die perl-xml-twig-tools machen grundlegend das gleiche, mit dem Unterschied, dass xmlstarlet rattenschnell ist im Vergleich zu der Perl-Gurke. Das fällt aber wahrscheinlich nur denjenigen auf, die noch einen mindestens 10 Jahre alten Rechner haben.

    So bekommt man mit xmlstarlet den Wert aus der XML-Datei(Der doppelte Slash ist so beabsichtigt):

    Code:
    xmlstarlet sel -t -v //InputFilename datei.xml
    Das Template, also das, was nach dem -v steht, ist ein sog. XPath-Ausdruck. Hier gibt's Syntax-Doku dazu: http://www.w3schools.com/xml/xpath_syntax.asp

    ...und posthum nach begraben des Threads:

    Zitat Zitat von H.Heckmeck
    Zitat Zitat von fork
    Das ist leider bei vielen Softwarepaketen der Fall. Ich fürchte, Du wirst Dich mit der englischen Doku zurechtfinden müssen.
    Vielleicht ist hier trotzdem jemand, der sowas aus dem Kopf kann?
    Fauler Sack!
    Geändert von fork (23.12.16 um 21:14 Uhr)

  6. #6
    Banned
    Registriert seit
    Feb 2005
    Beiträge
    1.151
    Da hast schon recht.

    xmlstarlet ist in C geschrieben.
    Das braucht man erst, wenn man richtig große Dinger auslutschen will,
    zum Preis, dass man sich einarbeiten muss.

    Für schlichte Extraktionen reicht mir xml_grep immer.
    Und das kann Hinz&Kunz ohne viel Nachlesen.
    Is halt Perl.

  7. #7
    Universaldilletant Avatar von fork
    Registriert seit
    Dec 2001
    Ort
    Frankfurt/Main
    Beiträge
    1.175
    Nachdem ich xml_grep mehrmals auf die 30 Zeilen von da oben losgelassen habe braucht das Dingens trotz caching aller Programmdateien immer noch:

    Code:
    time xml_grep --text_only InputFilename x2 
    /media/Benutzer/Fotos/2015-Mallorca/P1090370.RAW
    
    real	0m0.727s
    user	0m0.640s
    sys	0m0.052s
    Ich bin...

    • EMPÖRT!
    • VERZWEIFELT!
    • FASSUNGSLOS!


    Auf einem XEON E5:
    Code:
    time xml_grep --text_only InputFilename x
    /media/Benutzer/Fotos/2015-Mallorca/P1090370.RAW
    
    real	0m0.212s
    user	0m0.188s
    sys	0m0.020s
    Geändert von fork (23.12.16 um 21:33 Uhr)

  8. #8
    Banned
    Registriert seit
    Feb 2005
    Beiträge
    1.151
    Das geht ja mal gar nicht!

    Beseitige sofort die Ursache:
    rm -f /media/Benutzer/Fotos/2015-Mallorca/P1090370.RAW

  9. #9
    Universaldilletant Avatar von fork
    Registriert seit
    Dec 2001
    Ort
    Frankfurt/Main
    Beiträge
    1.175
    xmllint gibt's auch noch und das ist wohl eines der Basiswerkzeuge, da es direkt bei libxml2-utils dabei ist.

    Code:
    xmllint file.xml --xpath "//InputFilename/text()" datei.xml
    Passender Thread von unix.com dazu:
    http://www.unix.com/shell-programmin...-xml-file.html
    Geändert von fork (24.12.16 um 01:39 Uhr)

Ähnliche Themen

  1. Mit Bash-Skript rekursiv Dateien anzeigen lassen
    Von LouBen3010 im Forum Linux Allgemein
    Antworten: 8
    Letzter Beitrag: 12.05.14, 09:56
  2. Antworten: 8
    Letzter Beitrag: 13.04.08, 18:54
  3. In mehreren Files nach bestimmten Inhalt suchen ?
    Von schani im Forum Linux Allgemein
    Antworten: 5
    Letzter Beitrag: 13.07.05, 10:06
  4. Antworten: 9
    Letzter Beitrag: 27.03.05, 19:25
  5. bash: dateien suchen mit mindest-grösse?
    Von CboyGeek im Forum Linux Allgemein
    Antworten: 2
    Letzter Beitrag: 19.04.02, 11:34

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •