• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Die Bildungsoffensive hier im Forum geht weiter! Jetzt sollen Kreativität und technische Möglichkeiten einen neue Dimension erreichen. Das Thema in diesem Monat lautet - Verkehrte Welt - Hier geht es lang --> Klick

Script/Tool zum Schreiben eines Inhaltsverzeichnises in eine Textdatei

Mister Cool

Starking
Registriert
02.01.12
Beiträge
223
Hallo,
Ich suche nach einer einfachen Methode/Script/…, die ein bestimmtes Verzeichnis nach bestimmten Dateien durchsucht und für jede gefundene Datei eine Zeile in eine Text Datei schreibt -> hier eine Beispiel:

1. Angenommen in dem Verzeichnis /usr/Thomas/Bilder/Export/ befinden sich folgende Dateien (Fotos *_f.jpg + Fotothumbnails *_t.jpg):

foto1_f.jpg
foto1_t.jpg
foto2_f.jpg
foto2_t.jpg
foto3_f.jpg
foto3_t.jpg
…..

2. Der gewünschte Script, gestartet in dem obengenanten Verzeichnis, scannt das Verzeichnis nach den Fotos (also nach *_f.jpg bzw *_t.jpg) und generiert für jede gefundene Fotodatei ein Eintrag in eine Textdatei mit folgendem Inhalt:

FESTVORGEGEBENER_TEXT_1 foto1_f.jpg FESTVORGEGEBENER_TEXT_2 foto1_t.jpg FESTVORGEGEBENER_TEXT_3
FESTVORGEGEBENER_TEXT_2 foto2_f.jpg FESTVORGEGEBENER_TEXT_2 foto2_t.jpg FESTVORGEGEBENER_TEXT_3
FESTVORGEGEBENER_TEXT_3 foto3_f.jpg FESTVORGEGEBENER_TEXT_2 foto3_t.jpg FESTVORGEGEBENER_TEXT_3
….
Die FESTVORGEGEBENER_TEXT_1-3 sollten Sonderzeichen wie " : ; /<> enthalten dürfen und können in dem Script fix vordefiniert werden

Das ganze sollte als Input für eine HTML-Foto-Galerie genutzt werden (also HTML-Code) - hier ein "echtes" Beispiel

<td style="vertical-align: middle; height: 140px; width: 200px; text-align: center;"><a class="fancybox-effects-a" href="../images/foto1_f.jpg" data-fancybox-group="gallery2" ><img src="../images/foto1_t.jpg" alt=""></a></td>

Ich habe (noch) keine Ahnung von Scripts, aber ich stelle mir das irgedwie folgendvor (die syntax ignorieren - es ist nur "bilidliche" Darstellung)

VAR1 = FESTVORGEGEBENER_TEXT_1
VAR2 = FESTVORGEGEBENER_TEXT_2
VAR3 = FESTVORGEGEBENER_TEXT_3

$FOTOLISTE = ls *_f.jpg

for $FOTO in $FOTOLISTE
$FOTONAME = $FOTO ohne "_f.jpg"
print VAR1 $FOTONAME_f.jpg VAR2 $FOTONAME_t.jpg VAR3 > textdatei.txt
end
 
Zuletzt bearbeitet:
Mod-Info.

Mal nach Terminal verschoben. Ich hoffe dir kann hier eher jemand helfen!
 
Ach mir fällt zu deinem Problem ein einfaches Python-Skript ein:

Code:
import glob
import os

filelist_t = glob.glob("/path/to/files/x*t.jpg")
filelist_f = glob.glob("/path/to/files/y*f.jpg")

resultlist = []
for i in range(len(filelist_t)):
    file_path_string_t = filelist_t[i]
    file_path_string_f = filelist_f[i]
    filename_t = os.path.split(file_path_string_t)[-1]
    filename_f = os.path.split(file_path_string_f)[-1]
    res = "Irgendwas" + filename_t + "was anderes" + filename_f
    resultlist.append(res)

print resultlist

Das könnte funktionieren -- habe es nicht getestet.
 
Hi,

es scheitert leider bereits an dem import glob und import os.
Sind es irgendwelche zusätzliche "Module" zuerst geladen werden müssen (die unter Mac OS 10.7 noch nicht aktiv sind?

Ich bin inzw. weiter gekommen - ich habe folgendes ausprobiert und es funzt!!!

fotolist="$(ls *_f.jpg)"
for foto in $fotolist
do
thumb="$(echo $foto | sed "s/_f.jpg/_t.jpg/")"
echo TXT1 $foto TXT2 $thumb TXT3
done
 
Zuletzt bearbeitet:
Mit Skripten kenne ich mich wenig aus, ich bastle da immer ziemlich nach dem Try-and-Error-Prinzip, aber ist die Angabe im Eröffnungspost wirklich so gedacht, daß daß an der ersten Stelle eine wechselnde Variable steht und nicht immer Fest_vorgegebener_Text_1? Das würde das Skript sicher erheblich vereinfachen, wenn da nicht immer neue Variablen eingelesen werden müssten.
 
Hi,

ich habe auch gerade als absoluter Neuling den Siebenzeiler ausgetüftelt, und bin mir nicht sicher was du meinst.
Die Reihenfolge: TXT1 variable1 TXT2 variable2 TXT2 ist durch den gewünschten HTML-Code vorgegeben -> siehe oben :.hier ein "echtes" Beispiel..
 
Du wechselst oben in der ersten Spalte von 1 auf 2 auf drei, in Spalte 2 und 3 bleiben die Variablen immer auf 2 und 3.
Ich vermute mal, daß auch in der ersten Spalte immer, in jeder Zeile 1 stehen sollte (das wäre eine vergleichsweise simple Skriptvariante).
Muß aber nicht sein.
Nur solltest du dann, wenn es wirklich so sein sollte, auch angeben, woher die Variablen der ersten Spalte kommen, nachdem die dritte Datei abgearbeitet wurde. Wird dann die Variable immer automatisch um einen Zähler am Ende erhöht oder wird sie irgendwo ausgelesen?
 
es scheitert leider bereits an dem import glob und import os.
Sind es irgendwelche zusätzliche "Module" zuerst geladen werden müssen (die unter Mac OS 10.7 noch nicht aktiv sind?

Das sind Pakete der Standardlibrary und sollten eigentlich vorhanden sein!
 
>Du wechselst oben in der ersten Spalte von 1 auf 2 auf drei,

Etzertla, jetzt habe ich verstanden. Natürlich, Du hast recht, der Text für die erste Spalte bleibt natürlich für alle Zeilen gleich/fix -> war mein Tippfehler

Ich hätte noch eine Frage zu den unterschiedlichen Vorgehensweisen, die hier benutzt wurden, um das erzeugte Ergebnis in eine Datei wegzuschreiben.
Ich verstehe es so:

Methode 1 - aus dym Python-Script (sammelt zuerst den Output in einer Iteration-Schleife und schreibt ihn "am Stück" in eine Outputdatei, also die Outputdatei wird nur ein mal auf- und zugemacht)

fotolist = "$(ls *_f.jpg)"
resultlist = []
for i in range(len(fotolist)):
foto = fotolist
thumb = "$(echo $foto | sed "s/_f.jpg/_t.jpg/")"
res = "TXT1" + foto + "TXT2" + thumb + "TXT3"
resultlist.append(res)
print resultlist > output.html

Methode 2 - Mischung aus dym Python-Script und meinem Script (sammelt zuerst den Output in einer "for xxx in yyy do" Schleife und schreibt ihn "am Stück" in eine Outputdatei, also die Outputdatei wird nur ein mal auf- und zugemacht)

fotolist = "$(ls *_f.jpg)"
resultlist = []
for foto in $fotolist
do
thumb = "$(echo $foto | sed "s/_f.jpg/_t.jpg/")"
res = "TXT1" + foto + "TXT2" + thumb + "TXT3"
resultlist.append(res)
done
print resultlist > output.html

Methode 3 - mein erster Script (jede einzelne Outputzeile, ermittelt in einer "for xxx in yyy do" Schleife wird direkt in eine Outputdatei - also die Outputdatei wird mehrmals, pro Output-Zeile auf- und zugemacht)

fotolist= "$(ls *_f.jpg)"
for foto in $fotolist
do
thumb="$(echo $foto | sed "s/_f.jpg/_t.jpg/")"
echo TXT1 $foto TXT2 $thumb TXT3 >> output.html
done

Habe ich das richtig verstanden?

Und noch eine Frage. Ich habe den Script als create_code.sh benannt und in dem Foto-Verzeichnis gespeichert.
Was muss ich tun, damit ich ihn per Doppelcklick aus dem Finder starten kann? Zur Zeit wird er dabei in Texteditor geöffnet und zum Starten muß ich Terminal öffnen.
 
Zuletzt bearbeitet:
Ich würd's so machen:
Code:
#!/bin/bash

SRC_PATH=${1:-$(dirname "$0")}
OUT_FILE="out.txt"
TEXT_1='<td style="vertical-align: middle; height: 140px; width: 200px; text-align: center;"><a class="fancybox-effects-a" href="../images/'
TEXT_2='" data-fancybox-group="gallery2" ><img src="../images/'
TEXT_3='" alt=""></a></td>'


find "$SRC_PATH" -maxdepth 1 -type f -name '*_f.jpg' -exec basename '{}' \;| \
while read file
do 
echo "$TEXT_1 $file $TEXT_2 $(echo $file|awk '{sub(/_f\./,"_t.");print}') $TEXT_3"
done > "$SRC_PATH/$OUT_FILE"

So könnte man das Script irgendwo speichern und es mit einem Pfad als argument ausführen, z.b.
Code:
./dasscript.sh /pfad/der/fotos
Es erstellt dann OUT_FILE in /pfad/der/fotos

Oder, um deine letzte Frage zu beantworten, du kopierst es eben in /pfad/der/fotos, nennst es nicht "script.sh" sondern "script.command" und doppelklickst es aus dem Finder.
 
Hi,

inwischen macht mein Script alles was ich brauche und kann per doppelklick aus dem Finder gestartet werden, hat allerdings einen kleinen Schönheitsfehler - nach der Ausführung bleibt das Terminalfester offen, und nach jedem Doppelklick kommt ein neues Fenster dazu.
Wie kann ich das System dazu veranlassen, nach der Ausführung des Skripts das Terminalfenster wiederzuschliessen?
 
Hmm dann mit AppleScript.

Mall schnell zusammengesponnen (ginge natürlich eleganter... ^^):
Code:
[B]property[/B] TEXT1 : "<td style=\"vertical-align: middle; height: 140px; width: 200px; text-align: center;\"><a class=\"fancybox-effects-a\" href=\"../images/"
[B]property[/B] TEXT2 : "\" data-fancybox-group=\"gallery2\" ><img src=\"../images/"
[B]property[/B] TEXT3 : "\" alt=\"\"></a></td>"


[B]property[/B] findMask : "*_f.jpg"


[B]set[/B] srcPath [B]to[/B] [B]choose folder[/B] with prompt "Ordner auswählen" [B]with[/B] multiple selections allowed


[B]repeat[/B] [B]with[/B] aFolder [B]in[/B] srcPath
    [B]repeat[/B] 1 [B]times[/B] --fake continue        
        --liste mit den files restellen
        [B]set[/B] scFiles [B]to[/B] [I]paragraphs[/I] [B]of[/B] ([B]do shell script[/B] ¬
            "find " & quoted form [B]of[/B] (POSIX path [B]of[/B] aFolder) & " -maxdepth 1 -type f -name '" & findMask & "' -exec basename '{}' \\;")
        
        --überprüfen ob was gefunden wurde, wenn nicht fake continue
        [B]if[/B] ([B]count[/B] [B]of[/B] scFiles) < 1 [B]then[/B]
            [B]display alert[/B] "Keine Dateien gefunden!" message "Pfad: " & POSIX path [B]of[/B] aFolder & return & "Maske: " & findMask as warning
            [B]exit[/B] [B]repeat [/B]--das ist fake continue
        [B]end[/B] [B]if[/B]
        
        --ausgabedatei erfragen
        [B]set[/B] outFile [B]to[/B] ¬
            ([B]choose file name[/B] with prompt "Ausgabedatei angeben für Ergebnisse aus" & return & POSIX path [B]of[/B] aFolder default name "out.txt" default location aFolder)
        -- gibt einen alias zurück
        
        --outlist erstellen
        [B]set[/B] outList [B]to[/B] {}
        [B]repeat[/B] [B]with[/B] aFileName [B]in[/B] scFiles
            [B]set[/B] outList [B]to[/B] outList & ¬
                (TEXT1 & aFileName & TEXT2 & ([B]do shell script[/B] "echo " & aFileName & "|awk '{sub(/_f\\./,\"_t.\");print}'") & TEXT3)
        [B]end[/B] [B]repeat[/B]
        
        --ergebnisse in datei outFile schreiben
        [B]try[/B]
            [B]open for access[/B] outFile [B]with[/B] write permission
            [B]set[/B] oATID [B]to[/B] AppleScript's text item delimiters
            [B]set[/B] AppleScript's text item delimiters [B]to[/B] return
            [B]write[/B] (outList [B]as[/B] [I]string[/I]) to outFile
            [B]set[/B] AppleScript's text item delimiters [B]to[/B] oATID
            [B]close access[/B] outFile
        [B]on[/B] [B]error[/B] e
            [B]try[/B]
                [B]close access[/B] outFile
            [B]end[/B] [B]try[/B]
            [B]display alert[/B] "Fehler beim bearbeiten von" & return & POSIX path [B]of[/B] aFolder message e buttons {"Abbrechen", "Weiter"} cancel button 1 as warning
        [B]end[/B] [B]try[/B]
    [B]end[/B] [B]repeat[/B]
[B]end[/B] [B]repeat[/B]


[B]display alert[/B] "Feddsch!" buttons {"OK"} as informational

Das Ganze als App gespeichert und ab dafür.