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)
Allt är på samma rad, punkt och inte komma.

Ufraw 0.10-1


"ufraw-batch --wb=camera --exposure=auto --black-point=auto --gamma=0.47 --linearity=0.12 --saturation=1.02 --out-type=jpeg $i --output=- | convert - -unsharp 0.6x0.6+1.68+0.08 -filter Lanczos -resize 800x800 -bordercolor black -border 2 -quality 95"
 
Ditt exempel fungerar på version 0.10 här Carl. Är det du eller jag som måste uppgradera? :)

Jag skall prova 0.12.1 imorgon.

Gamman påverkar bl a. ljushet och färgmättnad. Jag skall inte förska ge mig på en förklaring för det kan jag inte. "Gamma adjustment of the base curve" säger manualen lite kryptiskt :) 0.47 är en väldigt liten justering, så egentligen spelar det inte så stor roll, men man vill ju kunna leka med alla inställningarna.

/B
 
Länge sedan det hände något i tråden. Dags att uppdatera. Dock inget shell script men värt att prova!

Metapixel -skapar mosaikbild av massa småbilder, ex http://www.complang.tuwien.ac.at/schani/metapixel/examples.html

Finns i Ubuntus förråd (sudo apt-get install metapixel)
Källkod:www.complang.tuwien.ac.at/schani/metapixel/

Börja med att skapa en arbetskatalog där metapixel kommer spara miniatyrer.
"mkdir ~/.metapixel"

Låt sen metapixel skapa miniatyrer av dina bilder, minst 1000 bilder rekomenderas för ett bra resultat. Detta behövs bara göras en gång, sen kan du skapa hur många mosaiker du vill.
"metapixel-prepare -r bildmapp/ .metapixel"

Sen är det dags att skapa mosaiken. Byt ut input_file.jpg till den bild du vill göra till mosaik och output_file.jpg till den nya bildens namn.
"metapixel --metapixel input_file.jpg output_file.jpg -l ~/.metapixel/ --cheat=30 --width=35 --height=35 --metric=wavelet --distance=20"

Klart!
 
Klipper in ett inlägg som jag skrev i en annan tråd.

Den här metoden för att numrera/döpa om filer i mapp använder jag.

Jag använder mig av ett skript som heter mvb.
Fungerar på Linux och *BSD.

1 Ladda hem http://www.xscd.com/pub/mvb/mvb_2.4.tgz
2 Packa upp
3 Kopiera skriptet till en mapp där operativet letar efter körbara skript, brukar vara '/usr/local/bin'.
Kopiera med kommandot 'cp mvb /usr/local/bin'
4 Gå till mappen dit du kopierade mvb. 'cd /usr/local/bin'
5 Gör skripet körbart med 'chmod a+x mvb'

Punk 3 och 5 kräver root-åtkomst, beroende på vilket system har, skriv 'sudo' innan kommandot eller logga in som superuser med 'su'.

Nu är skripet klart att användas.

1 Gå till mappen med filerna du vill döpa om 'cd /sökväg'
2 'mvb -i filnamn'

Klart! Alla filer i mappen döps om till det du skriver in efter mvb -i, med numrering efter.
-i gör att skripet ignorerar filändelsen.
Skripet skapar en gömd fil i mappen som den döper om filer så att man har möjlig att ångra namnbytet.
 
Intresant tråd, tyvärr är jag helt nollad vad det gäller programering...
Men jag vill lära mig att knacka ihop ett som skulle gör följande.

Öppnar filen -> Frågar användaren om befintligt namn skall användas, om inte -> Vill jag kunna lägga in eget namn -> Efter detta läsa exifen efter skapande datum & tid och skriva detta i namnet -> sedan lägga till räknare -> visa namnet och fråga om det är rätt -> om rätt göra på alla i mappen | Stopp/ta nästa fil i listan

Vet inte hur detta är möjligt i ett script.
Kör Ubuntu Hardy.

EDIT:Det får gärna köras från minneskort med SRC och DEST eller vad jag såg i tidigare trådare.

//Hannes
 
Senast ändrad:
Mitt inlägg i den trevliga skripttråden

Jag använder det här skriptet för att flytta bilder ifrån kameran och sortera in dem i datummappar. Bilderna får nya läsbara namn med datum och klockslag. Klockslaget är tyvärr lite kryptiskt för att filerna ska kunna öppnas i windows. Windows är inte världsbäst på att hantera kolon i filnamn på usb-diskar. Skriptet vänder på jpg-bilder så att gamla bildvisare som inte läser exif visar bilderna rättvända. Om man stannar uppe lite över tolv så hamnar foton man tar i samma mapp som innan tolv.
Som det är nu så funkar det bara för Nikon och *nix-baserat os.

Jag har använt php som språk för att jag inte klarar av att hantera ett traditionellt skriptspråks egenheter med mellanrum. Man behöver ha t.ex. php5-cli installerat för att köra skriptet.


Källkod:
#!/usr/bin/php

<?php

$camera="/media/NIKON D50/";
$src="/media/NIKON D50/DCIM/";
$dstraw="/home/per/Foton/Orginalbilder/";
$dstjpg="/home/per/Foton/Orginalbilder/";
$tmp="/home/per/Foton/Orginalbilder/".time()."/";
    
    
    
function my_exit($str) {
  exit("FEL - ".$str."\n\n");
}


if (in_array($argv[1], array('--help', '-help', '-h', '-?'))) {
?>
Ett bildflyttarskript för att flytta raw och jpgfiler
<?php

} else {
  echo $argv[1];
   
   
  if (!exec("which jhead")) my_exit("Programmet Jhead saknas, installera det! (apt-get install jhead)");
  if (!exec("which exiftool")) my_exit("Programmet Exiftool saknas, installera det! (apt-get install libimage-exiftool-perl)");
  is_dir($src) or my_exit("Källkatalogen ".$src." saknas, glömt att plugga in kameran?");
  is_dir($dstjpg) or my_exit("Målkatalogen ".$dstjpg." saknas, sätt i hårddisk eller något");  
  is_dir($dstraw) or my_exit("Målkatalogen ".$dstraw." saknas, sätt i hårddisk eller något");  
      
  @mkdir($tmp) or my_exit("Kan inte skapa tempkatalog");
   
  disk_free_space($tmp)>1000000000 or my_exit("För lite utrymme");

  echo "Kopierar bilderna från kameran\n";  
  
  exec("cp -r ".str_replace(" ","\ ",$src)."* ". escapeshellarg($tmp));
  echo "Raderar data\n";
  exec("rm -rf ".str_replace(" ","\ ",$src)."*");
  exec("umount ".str_replace(" ","\ ",$camera));
  echo "Klar! nu går det att stänga av kameran\n\n";
  echo "Flyttar och döper om filer\n\n";
  
  foreach (scandir($tmp) as $dir ){
    $tmpdir=$tmp.$dir;
    if ($dir != '.' && $dir != '..' && is_dir($tmpdir)){

      foreach (glob($tmpdir."/*") as $file) {
        $extension=pathinfo($file,PATHINFO_EXTENSION);
        if($extension=="NEF" || $extension=="JPG") {
          $date=exec("exiftool -fast -s -s -s -EXIF:CreateDate ".str_replace(" ","\ ",$file));

          $time=substr($date,11,5);
	  $time=str_replace(":","",$time);
          $hour=substr($date,11,2);
          $sec="s".substr($date,17,2);
          $date=str_replace(":","-",substr($date,0,10));

          if($hour<4) {
            $datedir=strtotime($date);
            $datedir=date("Y-m-d",$datedir-3600*24);
          } else {
            $datedir=$date;
          }

          touch($file,strtotime("$date $time$sec"));   // ställer in filsystemtid från exif
      
          if($extension=="NEF"){
            $newdir=$dstraw.$datedir;
            $ext=".nef";
          } else {
            $newdir=$dstjpg.$datedir;
            $ext=".jpg";
          exec("jhead -autorot ".str_replace(" ","\ ",$file));
          } 
          if(!is_dir($newdir)){
            @mkdir($newdir) or my_exit("Får ej skapa målkatalog");  
          }
          echo "Importerar ".basename($file)."\n";
          $newfile="$newdir/$date $time";

          // Flytta in filen till rätt ställe, bara kolla om det finns fler med samma tid först
   
          unset($equal_hm,$equal_s);
       
          foreach ( scandir($newdir) as $f ) {
          
            if ( strstr($f,"$date $time")&& strstr($f,$ext)){
              $equal_hm["$newdir/$f"]="foo";
            }
          } 

          if( !$equal_hm) {
            // det ingen fil med samma H:M, spara med H:M
            rename($file,$newfile.$ext);

          } else {
            // det finns filer med samma H:M
	    // sparar med H:M-num
            // kollar hur många det är och fixar första om det bara är en 
	    $no_files_equal_hm = count($equal_hm);
            $no=$no_files_equal_hm + 1;
	    rename($file,$newfile."-".$no.$ext);	

	    if($no_files_equal_hm==1) {
                list($file2, $sec2) = each($equal_hm);
                rename($file2,substr($file2,0,-4)."-1".$ext);
	    }
          }
        }
      }
      exec("rmdir ".str_replace(" ","\ ",$tmpdir));
    }

  }
  exec("rmdir ".str_replace(" ","\ ",$tmp));
}

echo "\nKlar!\n\n";


$line = trim(fgets(STDIN));

?>
 
Senast ändrad:
Hjälp med mellanrum

Nu har jag installerat Ubuntu 8.10 och börjat komma igång. Jag har skummat igenom denna tråd och klippt och klistrat ihop ett skript som flyttar bildfiler till mappar med fotodatum samt namnger filer med fotodatum och klockslag.
Det funkar bra så länge mappen jag läser från inte innehåller mellanslag i namnet. Men när jag sätter i minneskortet från Nikon D700 i datorn monteras det i en mapp med namnet "/media/NIKON D700" och själva bilderna ligger i "/media/NIKON D700/DCIM/100ND700".

Om jag definerar en variabel så här:
SRC='/media/NIKON D700/DCIM/100ND700'

så klarar inte skriptet att tolka det utan säger /media/NIKON finns inte. Inget konstigt så långt egentligen, eftersom det är ett mellanslag i namnet.

Har googlat lite och testat att sätta " runt, men det hjälper inte. Tipset att escapa mellanslag med \ så att det står
SRC="/media/NIKON\ D700/DCIM/100ND700"
funkar inte heller, oavsett om jag har " eller ' runt. Filen eller katalogen finns fortfarande inte.

Kan nån hjälpa mig med hur det ska vara. Hade det varit en helt vanlig mapp hade jag döpt om den utan mellanslag i namnet, men nu är det ju en mapp på minneskortet och den vågar jag inte ändra, kameran kanske inte klarar att hantera det?
 
Utan att ha sett ditt script så är det svårt att svara exakt, men antagligen behöver du escapa mellanslaget dubbelt, så att det finns kvar. Stoppa dit extra \ tills dess att det fungerar....
Och titta på de ställen där SRC expanderas. Eventuellt kan du behöva stoppa ":ar run expansionerna.
 
Och titta på de ställen där SRC expanderas. Eventuellt kan du behöva stoppa ":ar run expansionerna.

Jättetack! Det ska inte vara något \ alls om man istället sätter ut " överallt där de behövs.

Detta visar väl faran med att klippa och klistra utan att veta helt och hållet vad man gör. Å andra sidan är klipp-och-klistra ett utmärkt sätt att lära sig på.
Speciellt när man kan få hjälp om man kör fast. Tack igen. Detta ger mersmak...
 
Jag skulle behöva lite hjälp. Jag har en serie jpeg-bilder från en höghastighetskamera som jag ska göra film av. Problemet är att kameran tappar bilder ibland med hål i serienumren som följd. Jag skulle vilja fylla ut dessa hål med kopior av den sista tillgängliga bilden.

Bilderna är döpta enligt principen "namn tid serienummer.jpg". Vad jag vill är alltså att skriptet utgår från lägsta tillgängliga serienummer i mappen och sen för efterföljande filer kontrollerar om det bara är 1 steg större än föregående fil.

exempelvis om vi har
foo 15.jpg
foo 16.jpg
foo 18.jpg
foo 19.jpg

så ska den starta på nummer 15, lägga till en kopia av 16 med namn 17 och sen stanna då den kommer till 19.
Är det någon som har tips på hur jag löser detta?
 
Ungefär så här. Det här scriptet klarar inte filnamn som innehåller mellanslag. Jag tycker att man ska undvika sådana filnamn ändå, eftersom det blir bra mycket krångligare i många sammanhang.
Källkod:
#! /bin/bash

prefix=foo

compare=no
last=0
for f in *.jpg; do
    echo f==${f}
    f1=${f#${prefix}}
    f2=${f1%.jpg}
    if [ ${compare} == yes ]; then
	while ! ((${last}+1 == ${f2})); do
	    cp -p "${prefix}${last}.jpg" "${prefix}$((${last}+1)).jpg"
	    last=$((${last}+1))
	done
	last=$((${last}+1))
    else
	compare=yes
	last=${f2}
    fi
    echo f2=${f2}
done
 
För att enkelt byta ut mellanslag mot valfritt tecken, i mitt fall _ så kan du skriva:

rename "s/ /_/g" *

Detta byter ut alla mellanslag mot _ i filnamnen och bibliotek i den nuvarande katalogen
 
Utveckling av gammalt skritp

Med min nya quad core dator var det naturligtvis på sin plats att utnyttja samtliga kärnor när jag avänder skripten. Det här skriptet använder jag för samtliga bilder efter att jag har redigerat dom. Jag sparar dom alltid i fullformat och skalar ner dom mha det här skriptet (som ursprungligen kommer från den här tråden).

Källkod:
#!/bin/bash

convert_image() {
  for arg; do
    dirname=${arg%/*}
    prefix_arg=${arg/$dirname\//web_}
    convert -scale 400x400 -unsharp 0.5x0.5+1.65+0.03 \
            -quality 76 "$arg" "$prefix_arg"
  done
}
export -f convert_image
NPROC=`grep ^processor /proc/cpuinfo | wc -l`
find . -name '*.jpg' -print0 | xargs -0 -n 1 -P $NPROC bash -c 'convert_image "$@"' --

Skriptet tar alla jpg i aktuell katalog och skalar ned enligt convert.
NPROC tar reda på antal processorer (alt. kärnor) och xargs -P $NPROC ser till att antalet parallella jobb som pågår är detsamma som antal kärnor.

Vid test tar gamla skriptet ~50 sek och nya ~14 sek för samma filer.
 
geotagging + autorotering + creationdate-mapp

Här har även jag ett script i två ganska enkla versioner - såsom jag använder dem.
Det övre bygger på att ett annat program startar scriptet, och då den text som normalt kan skådas i prompten såsom echo's osv hamnar i ett subskal, så har jag använt mig av Zenity för att visa dess info grafiskt istället.

Det undre scriptet är tänkt att köras direkt i prompten.

Lite detaljerad info:
Scriptet förväntar sig att man har en gps-puck som heter dg-100 (liten smidig sak som finns på kjell o company), i annat fall får man en fråga om denne inte är inkopplad. (Även adra funkar, men man får ändra ett par rader då)

I övrigt var huvudkonceptet endast att skicka in bilderna i en katalog med namn efter deras creation-date ex. 2009-11-12 (som jag låter sno från exiv-datan) I övrigt autoroteras samtliga bilder. gps-taggningen är inställd på +1 timma (för att matcha svensk tid), Jag låter även gps-pucken outputta sin gpx och kml till en "gps-trashcan"-mapp, om den finns.

Det är anpassat för Nikon, men efterssom man specifiserar nerladdnings-mappen när man kör scriptet så funkar väl vilken kameramodell som..

Scripten kan startas med:
sh script.sh /här/är/bilderna /hit/ska/bilderna

inkluderade program:
- zenity
- jhead
- gpscorrelate
- gpsbabel
- exiv2

Källkod:
#!/bin/bash 

# Before running this script you might want to edit 
# some lines, or remark some for which you do not need,
# At least take a look in the gps-section, if you do 
# or do not have such a device.

clear

rm -rf /tmp/foto

mkdir /tmp/foto
date +20%y-%m-%d > /tmp/foto/date

echo "Rensat från tmp filer..."
#----------- Check -----------------

zenity --question --title "Time" --text "Is time correct? `date +20%y-%m-%d`"
 case $? in
  0) :;;      #ok
  1) exit 0;; #cancel
 esac

echo ""

if [ -e /dev/ttyUSB0 ];
 then echo "Gps-device present"
  touch /tmp/foto/gps
 else zenity --question --text "/dev/ttyUSB0 not found, skip gps?"
  case $? in
   0) :;; #ok
   1) zenity --info --text "Aborted." #Cancel 
    exit 0;;
  esac
fi

#----------- Here we go -----------

echo ""

#Kopies gps-data to tmp
#If you have a ex. Garmin-device you might want to 
#change the -i -option to "garmin" instead of dg-100.
#Also, see the 'erase' section here, on the second line, 'erase' is set to "1"
#and will erase all data on the device after successful transmission.

if [ -e /tmp/foto/gps ] ; then
   zenity --question --text "Charge /tmp with gps-data now?" --timeout=10
    case $? in
     0) gpsbabel -i dg-100,erase=0 -f /dev/ttyUSB0 -o gpx -F /tmp/`date +20%y-%m-%d`.gpx
        gpsbabel -i dg-100,erase=1 -f /dev/ttyUSB0 -o kml -F /tmp/`date +20%y-%m-%d`.kml ;;
     1) zenity --info --text "Aborted."
        exit 0;;
    esac
    else :
fi

echo ""

#---- Create creation-date -folder ---
#---- and copy files with some mods --

zenity --info --text "Ready to handle all files!"
for x in $1/* ; do
  echo "processing $x"
   mkdir -p $2/$(exiv2 $x | grep timestamp | awk '{print $4}' | sed 's/:/-/g')
    if [ -e /tmp/foto/gps ]
     then gpscorrelate --timeadd +01 -g /tmp/`date +20%y-%m-%d`.gpx $x  #gps-tags
     echo $x tagged!
     else :
    fi
    case $x in
     *.jpg)
      jhead -autorot $x;;
     *.JPG)
      jhead -autorot $x;;
     *);;
    esac
  /bin/cp -p $x $2/$(exiv2 $x | grep timestamp | awk '{print $4}' | sed 's/:/-/g')
done

if [ -d $2/gps-trashcan -a -e /tmp/`date +20%y-%m-%d`.??? ];
        then cp /tmp/`date +20%y-%m-%d`.??? $2/gps-trashcan/ && echo 'Copied gps-files to trashcan.'
fi

exit 0

Källkod:
#!/bin/bash 

# Before running this script you might want to edit 
# some lines, or remark some for which you do not need,
# At least take a look in the gps-section, if you do 
# or do not have such a device.

clear

rm -rf /tmp/foto

mkdir /tmp/foto
date +20%y-%m-%d > /tmp/foto/date

echo "Rensat från tmp filer..."
#----------- Check -----------------

if [ ! -d "$2"]; then
  echo "Mount your kamera first."
  exit 0
fi

   echo `date +20%y-%m-%d`                      # Check time
   echo 'Is time correct? (y/n)?'
   read -p "" ANS ;
if [ "$ANS" = "y" ] ;
  then :
  else echo "Correct time first, then rerun the script"
fi

echo ""

if      [ -e /dev/ttyUSB0 ]                     # Is gps attached?
        then echo "Gps-device present.." && touch /tmp/foto/do-gps
        else echo "/dev/ttyUSB0 not found, is your device powered on?"
             echo "Continue without adding coordinates?"
         read -p 'Continue (y/n)?' ANS
          if [ "$ANS" = "y" ];
           then echo "No coordinates it is..."
           else exit 0
          fi
fi

#----------- Here we go -----------

echo ""

#Kopies gps-data to tmp
#If you have a ex. Garmin-device you might want to 
#change the -i -option to "garmin" instead of dg-100.
#Also, see the 'erase' section here, on the second line, 'erase' is set to "1"
#and will erase all data on the device after successful transmission.

if [ -e /tmp/foto/do-gps ]
  then echo "Loading /tmp with gps-data..." 
   gpsbabel -i dg-100,erase=0 -f /dev/ttyUSB0 -o gpx -F /tmp/`date +20%y-%m-%d`.gpx
   gpsbabel -i dg-100,erase=1 -f /dev/ttyUSB0 -o kml -F /tmp/`date +20%y-%m-%d`.kml
#   stty -F /dev/ttyUSB0 -parenb cs8 cread 115200 -cstopb # (Might need this, if no ttyUSB*)
  else :
fi

echo ""

#---- Create creation-date -folder ---
#---- and copy files with some mods --

for x in $1/* ; do
  echo "processing $x"
   mkdir -p $2/$(exiv2 $x | grep timestamp | awk '{print $4}' | sed 's/:/-/g')
    if [ -e /tmp/foto/do-gps ]
     then gpscorrelate --timeadd +01 -g /tmp/`date +20%y-%m-%d`.gpx $x  #gps-tags
     echo $x tagged!
     else :
    fi
    case $x in
     *.jpg)
      jhead -autorot $x;;
     *.JPG)
      jhead -autorot $x;;
     *);;
    esac
  /bin/cp -p $x $2/$(exiv2 $x | grep timestamp | awk '{print $4}' | sed 's/:/-/g')
done

if [ -d $2/gps-trashcan -a -e /tmp/`date +20%y-%m-%d`.??? ];
        then cp /tmp/`date +20%y-%m-%d`.??? $2/gps-trashcan/ && echo 'Copied gps-files to trashcan.'
fi

echo 'All done!'
exit 0
 
Senast ändrad:
ANNONS
Götaplatsens foto – en riktig fotobutik.