• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] bash oder perl - array aus datei

Hallo,

ich versuche ein Script zu schreiben, das aus der Exif-Info von jpg's das Datum ausliest und (zwecks Ordnung) an den Namen des Bildes anhängt.

Im konkreten Fall habe ich ein Verzeichnis /home/username/pics in welchem so ca. 600 Fotos mit Dateinamen imgp2107.jpg, imgp2108.jpg, etc. liegen.

Nun möchte ich die Dateinamen in einem Perl-Script in ein Array einlesen.
Ich habe das so versucht:

exec ("ls -1 /home/username/pics > /home/username/pics/temp/pics.tmp");
open (PICS, "/home/username/pics/temp/pics.tmp");
@list = <PICS>;
close (PICS);
print @list;

Ich bekomme aber keine Ausgabe.
Auch mit zB.

print $list[1];

nicht.
Ich habe schon in anderen Foren gesucht und Beiträge gefunden, deren Code fast exakt wie meiner ist, bei denen funktioniert das angeblich.
Voraussetzung soll sein, das das File aus dem man ausliest zeilenweise aufgebaut sein muss, und diese Voraussetzung sollte ja mit "ls -1" gegeben sein.
Die erste Zeile des Scripts funktioniert jedenfalls. Es kommt nur einfach keine Ausgabe und auch keine Fehlermeldung, aber nach Ausführung befindet sich im angegebenen Verzeichnis auch meine pics.tmp-Datei, in der in jeder Zeile der Name eines jpg's steht.
Alles andere was das Script noch so können muss - Datum aus Exif extrahieren und an den Dateinamen anhängen, ne Schleife damit ein Foto nach dem Anderen abgearbeitet wird usw. sollte dann kein Problem mehr sein, es scheitert erstmal nur am Array.

Ich hätte auch überhaupt kein Problem damit, das ganze mit einem Shell-Script zu realisieren.
Da hab ich nur noch weniger Ahnung von Arrays - mit Perl hatte ich schon mal ein bißchen zu tun.
In der bash käme ich wahrscheinlich mit dem Rest des Scripts besser klar (cat,cut,grep,tr, etc)

Keinen Rat mehr weiss...
 

regexer

Advanced Hacker
fuzzymadge schrieb:
Ich habe das so versucht:

exec ("ls -1 /home/username/pics > /home/username/pics/temp/pics.tmp");
open (PICS, "/home/username/pics/temp/pics.tmp");
@list = <PICS>;
close (PICS);
print @list;
Unter Perl brauchst du keinen System-call mit "ls" zu machen. Probier es mal mit:
Code:
@list= (</home/username/pics/*>);
In @list stehen dann die entsprechenden Dateinamen mit Pfad. Siehe als Dokumentation hierzu http://www.rocketaware.com/perl/perlfunc/glob.htm

Dann wirst du denke ich irgendwie so weitermachen:
Code:
foreach $file (@list) {
  open (FILE, "<$file") or die "$!\n";
  #  verarbeite FILE
  #  ...
  close FILE
}
 

TeXpert

Guru
jetzt mal losgelöst von dem konkreten Perl-Problem, aber...

... Warum willst Du alle Dateien in ein Array einlesen? Wenn ich Dich richtig verstehe, willst Du Bild A umbenennen, parametrisiert durch EXIF-Tags von Bild A, d.h. die Daten von Bild B interessieren nicht, daher reicht eine Schleife über die Bilder doch aus:

Code:
for pic in *
do 
  SUFFIX=${B:${#B}-4}
  NAME=`basename $pic $SUFFIX`
  NAMEADDON=`exiftags "$pic" 2>/dev/null | grep 'Subject Distance' | sed -e 's#[^:]*: \(.*\)#\1#'`
  mv "$pic" "$NAME_$NAMEADDON_$SUFFIX" 
done
 
OP
F

fuzzymadge

Newbie
Vielen Dank - Ihr seid echt die Größten!

Habe im Moment etwas viel um die Ohren, deshalb kann ich Eure Anregungen erst in den nächsten Tagen umsetzen, aber ich hab den Thread schon mal auf "gelöst" geändert, weil sich mein Problem jetzt ziemlich sicher erledigt hat.

Danke!
 
Oben