ubuntuusers.de

gelöst: Dateien aus Dateiliste finden und kopieren

Status: Gelöst | Ubuntu-Version: Server 8.04 (Hardy Heron)
Antworten |

Orca74

Anmeldungsdatum:
23. April 2009

Beiträge: 4

Hallo, ich habe ein kleines Problem beim scripten. Folgender Sachverhalt:

Ordner (Fotos)
---2008
-----01
-----02
-----03
.
.
.
-----12
---2009
-----01
-----02
-----03
.
.
.
-----12

Jetzt versuche ich mit einem Script und find die Dateinamen aus einer Textdatei auszulesen. Diese Datei benenne ich jetzt mal 'bestell.liste' die dann so aussieht:

20080304-200149
20081224-160735
...

Die Dateinamen sind ohne Endung eingegeben, alle sind .jpg Files.

Hier das versuchte Script dazu:

#!/bin/bash

for file in $(cat /Fotos/bestell.liste);
find /Fotos -name $file -exec cp '{}' /BESTELLUNG/ \;
done

exit 0

Ich bekomme aber folgenden Fehler und weiß einfach nicht weiter:

./bestellen: line 9: syntax error near unexpected token `find'
./bestellen: line 9: `find /Fotos -name $file -exec cp '{}' /BESTELLUNG/ \;'

Wäre nett, wenn sich einer mal meinem Problem annehmen könnte und mir ein wenig Gedankenstütze leistet.

Danke & Gruß Orca74

uname

Anmeldungsdatum:
28. März 2007

Beiträge: 6030

Wohnort: 127.0.0.1

In der for-Zeile fehlt hinter dem Semikolon noch ein do

Orca74

(Themenstarter)

Anmeldungsdatum:
23. April 2009

Beiträge: 4

Mann, Mann, Mann,

30 cm vor dem Bildschirm und ich bin so blind.

#!/bin/bash

for file in $(cat /Fotos/bestell.liste);do
find /Fotos -name $file'.jpg' -exec cp '{}' /BESTELLUNG/ \;
done

exit 0

Hinter $file noch '.jpg' hinzugefügt und schon klappts.

Herzlichen Dank

Gruß Orca74

Orca74

(Themenstarter)

Anmeldungsdatum:
23. April 2009

Beiträge: 4

Hallo, jetzt würde ich mein Script noch erweitern, das heißt, wenn eine Datei nicht gefunden wurde, dann sollte halt ein Ausdruck kommen wie $file nicht gefunden.

Für weitere Hilfe bin ich dankbar. Gruß Orca74

Orca74 schrieb:

Mann, Mann, Mann,

30 cm vor dem Bildschirm und ich bin so blind.

#!/bin/bash

for file in $(cat /Fotos/bestell.liste);do
find /Fotos -name $file'.jpg' -exec cp '{}' /BESTELLUNG/ \;
done

exit 0

Hinter $file noch '.jpg' hinzugefügt und schon klappts.

Herzlichen Dank

Gruß Orca74

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4694

Wohnort: Berlin

@Orca74: Erstmal ein Verbesserungsvorschlag für's vorhandene Skript. Die Verwendung von cat an der Stelle bringt einige Probleme mit sich. Die vermeidet man, wenn man den Dateiinhalt in eine while-Schleife mit read mittels Dateiumleitung füttert.

Ausserdem ist es nützlich, wenn man konstante Werte wie Pfade am Anfang Namen gibt, damit man das Skript leichter anpassen und testen kann. Ungetestet:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/bin/sh

SOURCE_DIR='/Fotos'
TARGET_DIR='/BESTELLUNG/'
ORDER_FILE="$SOURCE_DIR/bestell.liste"

while read FILENAME
do
    find "$SOURCE_DIR" -name "$FILENAME.jpg" -exec cp '{}' "$TARGET_DIR" \;
done < "$ORDER_FILE"

Bei der vorliegenden Lösung wird der komplette Verzeichnisbaum unter /Fotos/ für jede Zeile in bestell.liste erneut durchsucht. Effizienter wäre es, den Verzeichnisbaum einmal einzulesen und eine Abbildung von Dateiname auf Pfad zu erstellen und dann die Zeilen aus der Bestellliste darin zu suchen. Dazu ist Shell-Skripting allerdings die falsche Programmiersprache.

Falls sich der Dateiname in der Verzeichnisstruktur wiederspiegelt, also die Datei 20080304-200149.jpg sich im Verzeichnis /Fotos/2008/03/ befindet, kann man sich das find natürlich auch sparen, weil man dann aus dem Dateinamen den Verzeichnisnamen ableiten kann. Ungetestet:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/bin/bash

SOURCE_DIR='/Fotos'
TARGET_DIR='/BESTELLUNG/'
ORDER_FILE="$SOURCE_DIR/bestell.liste"

while read NAME
do 
    FILENAME="$SOURCE_DIR/${NAME:0:4}/${NAME:4:2}/$NAME.jpg"
    if [ -f "$FILENAME" ]
    then
        cp "$FILENAME" "$TARGET_DIR"
    else
        echo "$FILENAME nicht gefunden."
    fi
done < "$ORDER_FILE"

Orca74

(Themenstarter)

Anmeldungsdatum:
23. April 2009

Beiträge: 4

@Marc 'BlackJack' Rintsch Du bist mein Held, das letzte Script funktioniert so wie ich es gern haben wollte. Das mit der NAME Funktion ist schon der Hit. Vielen Dank dafür...

Gruß Orca74

Antworten |