[bash] fotoscript

Pagina: 1
Acties:

  • rulus
  • Registratie: November 2005
  • Laatst online: 19-09-2025
Ben bezig met een scriptje dat foto's van een digicam moet gaan verwerken. Dit moet het doen:
  • lees onderwerp van reeks in
  • maak map op bureaublad met naam datum-onderwerp
  • kopieer alle foto's naar die map
  • draai foto's op basis van EXIF info
  • indien filmpjes aanwezig, kopieer naar mapje 'movies'
  • maak nieuwe map 'smalls' en kopieer alle foto's daarin
  • zoek per foto breedte en hoogte
    - als breedte > hoogte: verklein breedte max 600px
    - als breedte < hoogte: verklein hoogte max 600px
  • kopieer smalls map naar /media/kingston/datum-onderwerp
  • verplaats smalls map naar ~/Afbeeldingen/foto/
  • vraag of foto's van camera verwijderd moeten worden
  • unmount camera en usbstick !zonder wachtwoord in te geven!
Dit heb ik al:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#!/bin/bash

echo -ne "### Fotoverwerkingsscript ###\n\n"

## Onderwerp van de reeks inlezen ##
echo -ne "Geef het onderwerp van de reeks (zonder spaties): "
read title

## Mapnaam bepalen ##
datum=`date +%Y%m%d`
dirnaam=$datum-$title

## Foto's kopieren ##
aantalfotos=`find /media/usbdisk/ -name *.JPG | wc -l`
if [ $aantalfotos != 0 ]
    then
      echo -ne "Bezig met kopiëren van $aantalfotos foto's van camera naar harde schijf: "
      mkdir /home/roel/Desktop/$dirnaam
      for j in `find /media/usbdisk/ -name *.JPG`
        do 
         cp $j /home/roel/Desktop/$dirnaam/
        done
      echo -ne "Voltooid."
fi

## Video's kopieren ##
aantalvideos=`find /media/usbdisk/ -name *.MOV | wc -l`
if [ $aantalvideos != 0 ]
    then
      echo -ne "\nBezig met kopiëren van $aantalvideos video(s) van camera naar harde schijf: "
      mkdir /home/roel/Desktop/$dirnaam/movies
      for j in `find /media/usbdisk/ -name *.MOV`
        do 
         cp $j /home/roel/Desktop/$dirnaam/movies/
        done
    echo -ne "Voltooid."
fi

## Foto's draaien ##
echo -ne "\nBezig met draaien van foto's:\n"
cd /home/roel/Desktop/$dirnaam/
exifautotran *.JPG

## Vragen om slechte foto's te verwijderen ##
echo -ne "Verwijder de slechte foto's: "
read klaar

## Foto's verkleinen ##
echo -ne "Bezig met maken van kleine versies: "
mkdir /home/roel/Desktop/$dirnaam-smalls
cp -r /home/roel/Desktop/$dirnaam/* /home/roel/Desktop/$dirnaam-smalls/
cd /home/roel/Desktop/$dirnaam-smalls

for j in `find /home/roel/Desktop/$dirnaam-smalls/ -name *.JPG`
  do
   breedte=`identify -format "%w" $j`
   hoogte=`identify -format "%h" $j`
   if [ "$breedte" > "$hoogte" ]
       then
         mogrify -resize 600x -quality 100 -border 10 -bordercolor "#000" $j
       else
         mogrify -resize x600 -quality 100 -border 10 -bordercolor "#000" $j
   fi
  done
echo -ne "Voltooid."

## Smalls kopieren naar usbstick ##
echo -ne "\nBezig met kopiëren van kleine versies naar USB-stick: "
cp -r /home/roel/Desktop/$dirnaam-smalls /media/KINGSTON
echo "Voltooid."

## Smalls kopieren naar Mijn Afbeeldingen ##
echo -ne "Bezig met kopiëren van kleine versies naar lokale foto-map: "
mv /home/roel/Desktop/$dirnaam-smalls /home/roel/Mijn\ afbeeldingen/foto
echo "Voltooid."

## Eventueel foto's van camera verwijderen ##
echo -ne "Om de foto's van de camera te verwijderen, typ 'verwijder': "
read VERWIJDER

if [ "$VERWIJDER" = "verwijder" ]
    then
      rm -rf /media/usbdisk/
fi

echo -ne "Bezig met verwijderen van camera: "
echo "${PASSWD}" | sudo -S umount /media/usbdisk
echo -ne "Voltooid.\n"

echo -ne "Bezig met verwijderen van USB-stick: "
echo "${PASSWD}" | sudo -S umount /media/KINGSTON
echo -ne "Voltooid."

echo -ne "\n\n* Druk op Enter om af te sluiten *"
read


Maar het werkt dus niet. Hij vindt een fout in het 'find' commando om de foto's te verkleinen, terwijl ik exact dezelfde syntax erboven gebruik om te kopiëren en dat gaat wel goed. :?

Dit is de output:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
### Fotoverwerkingsscript ###

Geef het onderwerp van de reeks (zonder spaties): test
Bezig met kopiëren van 2 foto's van camera naar harde schijf: Voltooid.
Bezig met draaien van foto's:
Executing: jpegtran -copy all -rotate 90 P1000231.JPG
Verwijder de slechte foto's:
Bezig met maken van kleine versies: find: paths must precede expression
Usage: find [-H] [-L] [-P] [path...] [expression]
Voltooid.
Bezig met kopiëren van kleine versies naar USB-stick: Voltooid.
Bezig met kopiëren van kleine versies naar lokale foto-map: Voltooid.
Om de foto's van de camera te verwijderen, typ 'verwijder': verwijder
rm: cannot remove directory `/media/usbdisk/': Permission denied
Bezig met verwijderen van camera: Password:
Voltooid.
Bezig met verwijderen van USB-stick: Password:
Voltooid.

* Druk op Enter om af te sluiten *


Wie ziet de fout(en)?

  • Insanergy
  • Registratie: Juli 2001
  • Laatst online: 29-11-2025
Kan je niet ipv find, ls -l | grep -i *jpg gebruiken?

But I thought YOU did the backups...


Verwijderd

Insanergy schreef op woensdag 23 augustus 2006 @ 18:57:
Kan je niet ipv find, ls -l | grep -i *jpg gebruiken?
Nee, gewoon lekker find gebruiken. Maar wel -name "*.JPG" dus met de quotes, anders gaat bash proberen *.JPG te expanden op de command line, maar dat wil je dus niet.

  • Sjonny
  • Registratie: Maart 2001
  • Laatst online: 29-01 22:23

Sjonny

Fratser

en wat je ook veel beter kan doen is:
code:
1
find /path -iname \*jpg -exec cp {} /destination \;


ipv een for loop om de results van find heen. kan anders flink stuk gaan als er spaties of ' tekens in de filename zouden staan. het gaat voor jou nu alleen goed omdat je filenaam dat nooit heeft.

The problem is in the part of your brain that handles intelligence.


Verwijderd

Daar heb je gelijk in. Ik heb toevallig een tijdje terug een script geschreven dat automatisch thumbnails maakt van een foto-archief. Daarbij heb ik aparte scripts gemaakt voor bijvoorbeeld het thumbnails maken, zodat ik inderdaad -exec van find kon gebruiken. M'n collega's verzonnen nog weleens bestandsnamen met spaties enzo :|

  • rulus
  • Registratie: November 2005
  • Laatst online: 19-09-2025
Ik heb nu aanhalingstekens rond "*.JPG" gezet en dat lijkt wat te helpen :)

Hij doet echter nog altijd niet wat ik wil. Hij verkleint nu alle foto's tot een maximum breedte van 600px en maakt twee bestandjes aan: eentje met de naam 1920 en eentje met de naam 2560 (de lengte/breedte van de oorspronkelijke foto's).

Ik wil dat hij landschap-foto's verkleint tot een maximum breedte van 600px en portret-foto's tot een maximum hoogte van 600px...

  • jschot
  • Registratie: Oktober 2002
  • Laatst online: 09-07-2025
rulus schreef op woensdag 23 augustus 2006 @ 20:34:
Ik wil dat hij landschap-foto's verkleint tot een maximum breedte van 600px en portret-foto's tot een maximum hoogte van 600px...
Volgens mij kan dit gewoon met -resize 600x600. mogrify zal de foto dan met behoud van hoogte/breedte ratio binnen dit vierkant verkleinen.

  • A_L
  • Registratie: Juni 2001
  • Niet online

A_L

rulus schreef op woensdag 23 augustus 2006 @ 20:34:
Hij doet echter nog altijd niet wat ik wil. Hij verkleint nu alle foto's tot een maximum breedte van 600px en maakt twee bestandjes aan: eentje met de naam 1920 en eentje met de naam 2560 (de lengte/breedte van de oorspronkelijke foto's).
Gebruik een een integer-vergelijking ipv string vergelijking:
code:
1
if [ "$breedte" > "$hoogte" ]

wordt:
code:
1
if [ "$breedte" -gt "$hoogte" ]


Het kan zijn dat hij het bestand $hoogte wil aanmaken. ( als in echo xyz > /home/piet/bestand ) bron

  • rulus
  • Registratie: November 2005
  • Laatst online: 19-09-2025
Dat laatste heeft geholpen inderdaad :)
Pagina: 1