Annons

Linux shell-skript

Produkter
(logga in för att koppla)
steelneck skrev:
Jag skrev visserligen shell-skript, men kör på du, det skadar inte med lite annat också. Bara de inte blir allt för långa saker. En poäng med små korta saker är att det är lättare att förstå dem och kanske lära sig ett o annat på kuppen.

Till Per Danielsson vill jag säga; Tack, det där med "cat <<EOF >" var finurligt och gör saker lite enklare, den metoden kände jag inte till och jag kommer helt säkert att få nytta av det.

Okay. Antar att Perl borde vara gångbart iallafall.
 
Dela upp bilder

Jag fortsätter..

Såg en tråd här på FS där någon frågade efter ett program som kan dela upp bilder, jag insåg att det går nog att göra med IM, så jag skrev ett skript (typiskt "bra å ha"). Personen som frågade i tråden kör antagligen windows, så detta är nog inte lönt att klippa in i den tråden.. ;-)

Nåja, detta skript tar ett filnamn, frågar hur många delar bilden skall delas i horisontellt och vertikalt, slutligen i vilket filformat resultatet skall vara i.
Källkod:
#!/bin/bash
#
echo "Antal delar horisontellt:"
read DHOR
echo "Antal delar vertikalt:"
read DVER
echo "Resultates filformat (jpg,tif,png, osv..:"
read FF
GEO=`identify $1 | awk '{print $3}' | sed 's/x/ /g'`
HOR=`echo "$GEO" | awk '{print $1}'`
VER=`echo "$GEO" | awk '{print $2}'`
WI=`expr $HOR / $DHOR`
HI=`expr $VER / $DVER`
convert -crop $WI\x$HI $1 tile.$FF
 
Re: Dela upp bilder

steelneck skrev:
Jag fortsätter..

Såg en tråd här på FS där någon frågade efter ett program som kan dela upp bilder, jag insåg att det går nog att göra med IM, så jag skrev ett skript (typiskt "bra å ha"). Personen som frågade i tråden kör antagligen windows, så detta är nog inte lönt att klippa in i den tråden.. ;-)

Nåja, detta skript tar ett filnamn, frågar hur många delar bilden skall delas i horisontellt och vertikalt, slutligen i vilket filformat resultatet skall vara i.

Den var fiffig. Tackar!

/Arvid
 
Jag undrar om nån kan hjälpa mig med ett skript

Jag vill att alla mappar från /media/usbdisk/DCIM ska flyttas till /home/johan/Bilder/2006

Bilderna ligger i mappar justerat efter datum. Mapparna namnges dock 101ÅMMDD, 102ÅMMDD eller 103ÅMMDD. Jag vill dock att de ska heta ÅÅMMDD. Således skall 101, 102 eller 103 bytas ut mot en 0. Vidare vill jag att alla *.THM filer i mapparna skall tas bort.

Finns det något sätt att göra allt detta i en fil?


johan
 
WFS) (j.asplund skrev:
Finns det något sätt att göra allt detta i en fil?
Det finns flera sätt. Här är ett förslag:
Källkod:
#!/bin/sh

DU="/usr/bin/du"

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

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
Första gången du testar kan det vara klokt att använda den bortkommenterade raden som börjar med "cp" (kopiera) i stället för den följande som börjar med "mv" (flytta) för att inte riskera att förlora några bilder om något skulle gå fel. Och testa naturligtvis på några oviktiga bilder först.

Skulle du inte ha programmen 'du' och 'awk' på din maskin så gör det inte så mycket. De används för att man ska slippa se felmeddelanden om det råkar finnas tomma kataloger under DCIM.

/Staffan (som inte garanterar att skriptet fungerar i alla miljöer...)
 
Staffan_T skrev:
Det finns flera sätt. Här är ett förslag:
Källkod:
#!/bin/sh

DU="/usr/bin/du"

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

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
Första gången du testar kan det vara klokt att använda den bortkommenterade raden som börjar med "cp" (kopiera) i stället för den följande som börjar med "mv" (flytta) för att inte riskera att förlora några bilder om något skulle gå fel. Och testa naturligtvis på några oviktiga bilder först.

Skulle du inte ha programmen 'du' och 'awk' på din maskin så gör det inte så mycket. De används för att man ska slippa se felmeddelanden om det råkar finnas tomma kataloger under DCIM.

/Staffan (som inte garanterar att skriptet fungerar i alla miljöer...)

Jag upptäckte ett litet problem. Om jag kör detta skript utan att /media/usbdisk/DCIM finns så ändrar den istället vissa mappar och filer i /home/johan/. Hur fixar jag det?

Borde jag kanske lägga skriptet under nåt annat än /home/ skulle det hjälpa?
 
WFS) (j.asplund skrev:
Jag upptäckte ett litet problem. Om jag kör detta skript utan att /media/usbdisk/DCIM finns så ändrar den istället vissa mappar och filer i /home/johan/. Hur fixar jag det?

Borde jag kanske lägga skriptet under nåt annat än /home/ skulle det hjälpa?

problemet kvarstår även om jag flyttar skriptet till t.ex. /opt/ Lite mystiskt att vissa mappar i home/johan/ flyttas men andra inte. Går det ändra skriptet så att det endast funkgar dår /meda/usbdisk/DCIM finns?

tack
 
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
 
WFS) (j.asplund skrev:
problemet kvarstår även om jag flyttar skriptet till t.ex. /opt/ Lite mystiskt att vissa mappar i home/johan/ flyttas men andra inte. Går det ändra skriptet så att det endast funkgar dår /meda/usbdisk/DCIM finns?

Jodå, om du ändrar din frågeställning till; att skriptet endast funkar om /media/usbdisk/DCIM finns.

if [ -e /media/usbdisk/DCIM ]
then
# lägg in scriptet här nedan
#
#
else
echo "Katalogen /media/usbdisk/DCIM existerar ej"
fi
 
en bra oneliner för att snabbt generera MD5-summor av alla filer i ett katalogträd (tex innan bränning av DVD)

Källkod:
cd katalogensomskallbrännas
find . -type f | egrep -iv '(\.dat$|\.db$)' | xargs -n 500 md5sum >> md5sums.txt

| egrep -iv '(\.dat$|\.db$)' exkluderar Thumbs.db och annat tjafs, detta kan skippas om man vill ha checksummor på *alla* filer eller om man redan rensat ut dem.

xargs gör att kommandoraden inte blir för lång


för att kontrollera checksummorna:
md5sum -c md5sums.txt

kontroll under windows tex: http://www.md5summer.org/


md5sum finns även i det eminenta cygwin-paketet (unixverktyg för windows)
 
Ett enkelt skript som raderar kvarlämnade .thm-filer, användbart när sorteringsprogrammet inte automatiskt raderar .thm filer tillsammans med bildfilen (eg. Irfanview). Skriptet förutsätter crw/thm, men är lätt att modifiera för godtyckliga filnamnspar.

/Daniel

Källkod:
#!/bin/sh
#
# Daniel Nordling
# 2005-12-22
# 
# Remove superfluous .thm files

if [ -d "$1" ]
then
   directory=$1      # If a directory name given as a script argument...
else
   directory=$PWD    # Otherwise use current working directory.
fi

for thmfile in $directory/*.THM	# Get list of THM files
do
   crwfile=${thmfile//.*THM/.CRW} 	# Replace .THM with .CRW
   if ! [ -e "$crwfile" ]		# If CRW file does NOT exist
   then
      echo "removing: $thmfile"
      rm $thmfile		# then delete THM file
   fi
done
exit 0
 
Här ett litet skript för att rekursivt söka (söker i alla underkataloger relativt aktuell arbetskatalog) efter jpeg bilder med en viss IPTC info. Används som: "skriptnamn sökord" och det svarar med: sökvägen/filnamnet.jpg

Källkod:
#!/bin/bash
LIST=`find . -name *.jpg`
for i in $LIST; do 
if iptc $i | grep -q $1 
then
echo "$i" 
fi
done

Edit: Skriptet kräver att libiptcdata finns installerat.
 
Oopsss... litet fel..

Källkod:
#!/bin/bash
LIST=`find . -name *.jpg`
for i in $LIST; do 
if iptc $i | grep -q $1 
then
echo "$i" 
fi
done

Raden som börjar med LIST skall givetvis se ut så här:
Källkod:
LIST=`find . -name "*.jpg"`
 
Bara för att hålla liv i denna tråd och fortsätta dela med mig (å kanske få lite feedback), så bryter jag "regeln" att klippa in kod, jag ger en länk istället eftersom koden blir lite för lång...

Jag har just skrivit en IPTC-editor i ett shellscript som använder Xdialog för att skapa ett grafiskt gränssnitt. Det har just kommit så långt att det är praktiskt användbart, endast testat på min maskin, således första publika versionen, det lämnar säkert en hel del i övrigt att önska, prova det gärna och säg gärna vad ni tycker (ni blir de första att prova):

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

Skriptet kräver att iptc/libiptcdata och Xdialog finns installerat och genom att Xdialog använts som GUI så finns vissa "språkliga" problem eftersom iptc internt använder UTF-8 och Xdialog som bygger på gamla GTK+ inte har stöd för UTF-8. Skriptet kräver, som jag skrivit det, att systemet använder en ISO-teckenkodning (kontrollera med "locale charmap"). Skriptet används som "skriptnamn filnamn" och det kan ta en lista med filnamn, det funkar mao. fint att lägga in i er filhanterares högerklickmeny för jpeg bilder.
 
Får man lägga in ett önskemål till er tidsmiljonärer?
-Något jag skulle vilja ha när jag surfar på FS och andra bildsiter är ett program som "maskar" åt mig. Det ska helt enkelt vara ett grått (eller valfri färg) fönster som man maximerar på sin skärm.
I detta fönster finns en transparent rektangel som man kan flytta omkring och ändra dimensioner på. Om jag hade ett sånt program skulle jag slippa att sitta med händerna eller pappbitar då jag vill testa beskärningar på de bilder jag surfar till.

Bra idé va? Kan någon fixa det?
 
ANNONS
Spara upp till 12000 kr på Nikon-prylar