Som Plus-medlem får du: Tillgång till våra Plus-artiklar | Egen blogg och Portfolio | Fri uppladdning av dina bilder | Rabatt på kameraförsäkring och fotoresor | 20% rabatt på Leofoto-stativ och tillbehör | Köp till Sveriges mest lästa fototidning Fotosidan Magasin till extra bra pris.

Plusmedlemskap kostar 349 kr per år

Annons

Linux shell-skript

Produkter
(logga in för att koppla)
danielstenholm skrev:
borde funka men då flyttas filerna relativt där jag står när jag skriver kommandot. Är det någon som har en bra lösning på detta vore jag kanontacksam?

Jag har ingen möjlighet att testköra det här så ta det med en stor nypa salt. Det är inte snyggt på något vis, men det är iaf en start:

Källkod:
for file in `find /path/to/images -type f`; do
   new_path=`echo $file | sed 's,\(.*\)/.*,\1/../,'`
   echo $file $new_path
done
Om det fungerar så byt echo mot cp eller mv.

Edit: Har du kommatecken i sökvägen så byt delimiter i sed-uttrycket.
 
WFS) (j.asplund skrev:
Jag skulle vilja ha ett nautilus-skript som vid högerklick på en eller flera bilder lät mig skriva in nyckelord i exif:en. Det vore utmärkt och det vore möjligt att få upp en pop-up ruta där jag kan skriva in nyckelord som sedan sparas i exifen och därmed blir sökbara med beagle.

Exif är inte tänkt för nyckelord, det är tänkt för mer kameraspecifik och sas. "teknisk" data. IPTC däremot är ämnat för precis det du funderar över. IPTC-data kan innehålla allt från nyckelord, långa beskrivningar, namn på platser, Byline osv..

Jag har ett skript för att "tagga" bildfiler med IPTC-data som hittas under länk nedan:

http://web.telia.com/~u97007522/linux/code/mkiptc

(lite för långt skript för att klistra in här)

Skriptet kräver att xdialog, libiptcdata och Imagemagick finns installerat. Xdialog används för att skapa ett grafiskt gränssnitt och IM för att kunna se en hyggligt stor tumnagel av bilden man för tillfället jobbar med (200px kortsida). Skriptet kan ta en hel lista med filer, så man behöver inte starta skriptet för varje bild, man jobbar dock med en och en åt gången (jag har satt "ByLine" och "Country" som standardvärden, så dessa behöver inte skrivas in - ändra dessa i skriptet så att inte mitt namn används - ändra de två första variablerna för CONTR och AUTHR).

Tidigare i tråden lade jag in ett kort skript som kan användas för att söka IPTC-data (söker rekursivt = i alla underkataloger sett från katalogen man för tillfället står i).
 
Staffan_T skrev:
Man kan testa att katalogerna finns och avbryta om SRC eller DEST skulle saknas. T ex så här:
Källkod:
#!/bin/sh

DU="/usr/bin/du"

SRC="/media/usbdisk/DCIM"
DEST="/home/johan/Bilder/2006"

if [ ! -d "$SRC" ]
then
  echo "$SRC finns inte!"
  exit
elif [ ! -d "$DEST" ]
then
  echo "$DEST finns inte!"
  exit
fi

cd $SRC
for i in *
do

  NEWDIR=`echo ${DEST}/0${i:3}`
  if [ ! -d "$NEWDIR" ]
  then
    mkdir "$NEWDIR"
  fi

  DS=`$DU $i | awk '{print $1}'`
  if [ "$DS" -gt 0 ]
  then
    # cp -v $i/* "$NEWDIR"
    mv $i/* "$NEWDIR"
  fi

  rmdir $i
  rm -f $NEWDIR/*.THM

done

Jag undrar om det går att ändra detta skript så att det även roterar (enligt EXIF) alla JPE- och JPG-bilder som kopieras.
 
WFS) (j.asplund skrev:
Jag undrar om det går att ändra detta skript så att det även roterar (enligt EXIF) alla JPE- och JPG-bilder som kopieras.
Det är busenkelt. Se till att jpegtran och jhead finns installerat och i din sökväg.

Sedan lägger du bara in följade anrop på lämpligt ställe i ditt skript:

jhead -autorot *.jpg *.jpe

eller liknande (beroende på vilka filer du vill rotera). Den roterar de bilder (förlustfritt mha jpegtran) där exif anger att den ska roteras och nollställer rotationsflaggan.
 
Det där skulle ju vara rätt smidigt, det ska jag testa! ...men vänta lite nu. Jag har ju ingen exifinformation i mina jpg-ar. Hmm ...*läser manualsidor*... nope, inga insikter eller snilleblixtar. Suck! Jaja, efter lunchen kanske jag fattar mer.

För att summera, är det någon som har tips på hur jag kopierar exifinformationen från en fil till en annan?
 
Nja, EXIV2 klarar ju bara att läsa exif från jpeg-filer. Det är i raw-filerna (.cr2) jag har något att läsa och där går det sämre, inte alls rent av. Har jag helt enkelt missat något?

Men tack ändå.
 
Ok, du sade inte att det var cr2/raw-filer du hade. (Det kallas inte exif när informationen lagras i dem, jpeg och tiff som är exiffiler.)

Men tydligen ska exiftool klara att hantera cr2-filer. Jag har aldrig provat eftersom jag inte har en kamera som genererar sådan filer (och mina lägger in exifinformationen åt mig).
 
Staffan_T skrev:
Man kan testa att katalogerna finns och avbryta om SRC eller DEST skulle saknas. T ex så här:
Källkod:
#!/bin/sh

DU="/usr/bin/du"

SRC="/media/usbdisk/DCIM"
DEST="/home/johan/Bilder/2006"

if [ ! -d "$SRC" ]
then
  echo "$SRC finns inte!"
  exit
elif [ ! -d "$DEST" ]
then
  echo "$DEST finns inte!"
  exit
fi

cd $SRC
for i in *
do

  NEWDIR=`echo ${DEST}/0${i:3}`
  if [ ! -d "$NEWDIR" ]
  then
    mkdir "$NEWDIR"
  fi

  DS=`$DU $i | awk '{print $1}'`
  if [ "$DS" -gt 0 ]
  then
    # cp -v $i/* "$NEWDIR"
    mv $i/* "$NEWDIR"
  fi

  rmdir $i
  rm -f $NEWDIR/*.THM

done
Ok nu har jag kommit på ett ny förändring. Jag önskar att filändelsen JPE ändras till JPG och att thm filerna endast tas bort då de har samma namn som en JPE-fil och inte då de har samma namn som en MRW-fil
 
WFS) (j.asplund skrev:
Ok nu har jag kommit på ett ny förändring. Jag önskar att filändelsen JPE ändras till JPG och att thm filerna endast tas bort då de har samma namn som en JPE-fil och inte då de har samma namn som en MRW-fil
Källkod:
#!/bin/sh

DU="/usr/bin/du"

SRC="/media/usbdisk/DCIM"
DEST="/home/johan/Bilder/2006"

if [ -x /usr/bin/jhead ]
then
  ROTATE=TRUE
else
  ROTATE=FALSE
  echo "Hittar inte /usr/bin/jhead"
fi

if [ ! -d "$SRC" ]
then
  echo "$SRC finns inte!"
  exit
elif [ ! -d "$DEST" ]
then
  echo "$DEST finns inte!"
  exit
fi

cd $SRC
for i in *
do
  if [ -d $i ]
  then

    NEWDIR=`echo ${DEST}/0${i:3}`
    if [ ! -d "$NEWDIR" ]
    then
      mkdir "$NEWDIR"
    fi

    DS=`$DU $i | awk '{print $1}'`
    if [ "$DS" -gt 0 ]
    then
      # cp -v $i/* "$NEWDIR"
      mv $i/* "$NEWDIR"
    fi

    cd $NEWDIR
    for j in *.JPE
    do
      FN=`basename $j .JPE`
      NEWFN="$FN.JPG"
      mv $j $NEWFN
      rm -f $FN.THM
    done
    if [ $ROTATE=TRUE ]
    then
      /usr/bin/jhead -autorot *.JPG
    fi
    cd $SRC

    rmdir $i
  fi

done
 
steelneck skrev:
Här ett skript som använder ImageMagicks convert kommando för att skala ned och rama in en bild och sätta en "vattenstämpel" med fotografens namn. Observera att detta skript skriver över orginalbilden om filnamnet slutar på .jpg, så använd detta på en kopia. Jag bifogar en bild på resultatet av detta skript. Skriptet används, exempel: ./skriptnamn.sh filnamn.tif
Källkod:
#!/bin/bash
#
in=$1
ut=${in%.*}.jpg
convert -scale x250 -filter Lanczos -unsharp 0x0.9+1.10+0.03 \
-border 2x2 -bordercolor black \
-font helvetica -pointsize 14 -draw "gravity SouthEast \
fill black text 7,12 'Foto: Magnus Stålnacke ' \
fill #aaa text 8,11 'Foto: Magnus Stålnacke ' " \
-border 1x1 -bordercolor grey \
-frame 4x4 -mattecolor black \
-quality 76 $in $ut


Jag får inte skripet att fungera på flera filer samtidigt, tips på hur jag ska lösa det?
 
antingen hacka om scriptet med en for-loop eller kör direkt på kommandoraden;

Källkod:
for PIC in fil1 fil2 fil3; do ./skriptnamn.sh $PIC; done
 
carl_fredriksson skrev:
Jag får inte skripet att fungera på flera filer samtidigt, tips på hur jag ska lösa det?

Man använder en for loop, så här:
Källkod:
#/bin/sh
#
for i in *.jpg; do
convert -scale x250 -unsharp 0.5x0.5+1.65+0.03 \
-border 2x2 -bordercolor black \
-font helvetica -pointsize 14 -draw "gravity SouthEast \
fill black text 7,12 'Foto: Ditt Namn ' \
fill #aaa text 8,11 'Foto: Ditt Namn ' " \
-border 1x1 -bordercolor grey \
-frame 4x4 -mattecolor black \
-quality 76 $i Ram_$i
done

Jag har förbättrat uppskärpnings-variablerna lite, och skriptet ovan tar bara .jpg filer (blir enklare så).

Edit: Ja givetvis kan man också göra som min namne här ovan föreslog. Alternativt:
Källkod:
for PIC in *.jpg; do ./skriptnamn.sh $PIC; done
Så att det tar alla jpg i aktiv katalog.
 
steelneck skrev:
Man använder en for loop, så här:
Källkod:
#/bin/sh
#
for i in *.jpg; do

[...]
Nackdelen med detta är att den bara tar filer med ändelsen jpg, tar alla och i den katalog där man står. Bättre är om man kan specificera filerna själv vilket en liten modifikation tillåter:

Källkod:
#/bin/sh
#
for i in [b]"$@"[/b]; do
convert -scale x250 -unsharp 0.5x0.5+1.65+0.03 \
-border 2x2 -bordercolor black \
-font helvetica -pointsize 14 -draw "gravity SouthEast \
fill black text 7,12 'Foto: Ditt Namn ' \
fill #aaa text 8,11 'Foto: Ditt Namn ' " \
-border 1x1 -bordercolor grey \
-frame 4x4 -mattecolor black \
-quality 76 [b]"$i" "Ram_$i"[/b]
done
Mina förändringar är satta i fetstil. $@ är argumenten som anges på kommandoraden. Citattecknen kring denna och kring $i respektive Ram_$i är för att förhindra problem när filnamnet innehåller mellanslag. Utan cittattecknen blir for-loopen förvirrad när den ska splitta upp i argumentsträngen $a och filen "kaka är gott.jpg" kommer att bli tre varv i loopen, med värdet på $i som "kaka", "är" respektive "gott.jpg".

Oj, det var länge sedan man gjorde lite bash-programmering. Kanske är dags igen, fast Perl är så mycket roligare :)
 
maxzomborszki skrev:
Mina förändringar är satta i fetstil. $@ är argumenten som anges på kommandoraden.

Se där, alltid lär man sig nåt nytt. "$@" kommer jag direkt at ha nytta av i några av mina skript.

Å det slår mig helt plötsligt... Till alla er som sas. är ny i den fria kodens värld. Detta är "lönen" för att dela med sig. Man får både fungerande program, lösningar och kunskap man inte hade tidigare, endast till priset av att själv dela med sig.

Passar på att klippa in ett till skript, som dock inte har begåvats med Max lilla nyttiga tips. Detta skript skalar (jpg,tif,pnm,ppm)bilder utifrån vald upplösning och önskad höjd på bilden i millimeter, det beräknar också någotsånär lämpliga USM-parametrar utifrån vald upplösning och bäddar in en färgprofil innan en kopia av bilderna sparas som jpg med "S_" tillagt till filnamet. Skriptet skapar också en jpg innehållande tumnaglar av alla bilder som skriptet behandlat. OBS. sätt in korrekt sökväg till er profil, den funktionen kan givetvis också skippas, radera då från "-profile /sökväg/fil.icc".

Själv använder jag detta skript för filer jag skickar till labb.

Källkod:
#!/bin/bash 
#
#*** Input ***
#
echo "Chose PPI:"
read PPI
echo "Chose image height in mm:"
read MM 
#
#*** Calculate image size ***
#
Ss=`echo "scale=4; $MM / 25.4 * $PPI" | bc`
Si=`echo $Ss | sed 's/\..*//'`
#
#*** Calculate USM Radius and Sigma ***
#
USMr=`echo "scale=1; $PPI / 140" | bc | sed 's/^\./0\./'`
if [ "$USMr" \> 1 ] 
then
USMs=`echo "scale=1; sqrt($USMr)" | bc | sed 's/^\./0\./'`
else
USMs=$USMr
fi
#
#*** Scale images ***
#
echo 'Scaling pictures....'
#
LIST=`ls | grep ".jpg\|.tif\|.ppm\|.pnm"`
for i in $LIST; do
 u=${i%.*}.jpg
 convert -resize x$Si -density $PPIx$PPI \
 -unsharp $USMr x $USMs+1.1+0.03 \
 -type TrueColor -quality 96 \
 -profile /*SÄTT IN SÖKVÄG*/AdobeRGB1998.icc  $i S_$u
 echo "$i --- klar"
done
#
convert 'vid:S_*.jpg' directory.jpg
 
Jag har klippt och klistrat lite och fått ihop ett skript som kopierar alla filer från min kamera och sorterar dom i mappar som den skapar efter när fotot togs efter infon i exif.

Jag har stött på två problem. Det första är att jag inte får ut datumet från min kompakt (Konica Minolta Dimage G400). Skriver jag exif <filnamn> får jag fram datumet när bilden togs men med exif -l <filnanm> är det tomt i 0x0132 Date and Time-raden. Detta leder till att skriptet inte hittar något datum och inte heller skapar någon mapp.

Varför får jag inte fram datumet ur exif när det finns där?

Jag undrar om någon skulle vilja hjälpa mig med att ändra skripet så att om datumvärdet är tomt i exif ska den kopiera de bilder till en ny mapp med dagens datum istället.

---------------------------------
#!/bin/bash
DU="/usr/bin/du"

SRC="/media/G400-SD/DCIM/100KM001/"
DEST="$HOME/Desktop/Foto"

if [ ! -d "$SRC" ]
then
echo "$SRC finns inte"
exit
elif [ ! -d "$DEST" ]
then
echo "$DEST finns inte"
exit
fi

cd $SRC
for i in *JPG
do

BILDDATUM=`exif -t 0x0132 $i |grep Value| awk {'print $2'}|sed -e's/\:/-/g'`

NYMAPP=`echo $DEST/$BILDDATUM`

if [ ! -d "$NYMAPP" ];
then
mkdir "$NYMAPP"
fi

DS=`$DU $i | awk '{print $1}'`
if [ "$DS" -gt 0 ]
then
cp -v $i "$NYMAPP"
# mv $i "$NYMAPP"
fi

done
nautilus ~/Desktop/Foto
---------------------------------
 
carl_fredriksson skrev:
Skriver jag exif <filnamn> får jag fram datumet när bilden togs men med exif -l <filnanm> är det tomt i 0x0132 Date and Time-raden. Detta leder till att skriptet inte hittar något datum och inte heller skapar någon mapp.

Varför får jag inte fram datumet ur exif när det finns där?

Min kamera skriver datum och tid i tre olika taggar, förutom 0x0132 så används även 0x9003 och 0x9004. Prova med någon av dem.

Du kan kolla med "exif -i <filnamn>", då listas siffer ID istället för beskrivande namn.
 
carl_fredriksson skrev:Jag undrar om någon skulle vilja hjälpa mig med att ändra skripet så att om datumvärdet är tomt i exif ska den kopiera de bilder till en ny mapp med dagens datum istället.
[/B]

Lägg in nedanstående rad efter den där du sätter variabeln BILDDATUM:

[ X$BILDDATUM = "X" ] && BILDDATUM=`date +%Y-%m-%d`

Om variabeln är tom så sätts den till dagens datum (på formatet 2007-01-06). Var det ungefär vad du ville?

På raden ovan skall väl fnuttarna vara utanför krullparanteserna i awk-raden? Personligen tycker jag det blir mer lättläst om man slår ihop grep och awk till awk '/Value/{print $2}', men det gör man ju som man vill.
 
ANNONS
Spara upp till 12000 kr på Nikon-prylar