Bash script.

Kategori overført fra Linux1

Bash script.

Innleggav kennethr » fre 08.09.2006 12:02

Hei,

Prøver å få til ett script som skal resize bildefiler til 1200 pixler på kortsiden.
Får problemer når det er mellomrom i filnavnet.

Bruker mogrify (ImageMagick) til å resize bildene og find til å "finne dem".

Feilmeldingene jeg får når navnet på en fil inneholder mellomrom er:

mogrify: unable to open image `32307/FK1020/1/005': No such file or directory.
mogrify: unable to open image `rektgul': No such file or directory.
mogrify: unable to open image `b5.jpg': No such file or directory.
mogrify: unable to open image `32307/FK1020/1/006': No such file or directory.
mogrify: unable to open image `fiolett': No such file or directory.



Jeg er helt nybegynner med scripting, så dette kan sikkert gjøres på en enklere og bedre måte.



#!/bin/bash

ECHO="/bin/echo"
TOUCH="/bin/touch"
MOGRIFY="/usr/bin/mogrify"
RM="/bin/rm"
INN="/ordre/inn"
UT="/ordre/ut"
LOCKFILE="/ordre/lock.lck"
LOGFILE="/ordre/log.txt"
ORDERS=`ls $INN`


# Script start

cd $INN

if [ -e "$LOCKFILE" ]; then
$ECHO "Scriptet kjører allerede..." >>$LOGFILE
exit
fi

$TOUCH $LOCKFILE

for ORDER in $ORDERS; do
if [ -e "$INN/$ORDER/transfer" ]; then
$ECHO "Start-fil funnet for ordren $ORDER." >>$LOGFILE
cd $INN/
$ECHO "Roterer $ORDER..." >>$LOGFILE
mogrify -rotate "-90<" `find $ORDER -iname *.jpg`
$ECHO "Ferdig med rotering av $ORDER..." >>$LOGFILE
$ECHO "Resizer $ORDER..." >>$LOGFILE
mogrify -resize x1200 `find $ORDER -iname *.jpg`
$ECHO "Ferdig med resizing av $ORDER..." >>$LOGFILE
$ECHO "Flytter $ORDER til UT mappe..." >>$LOGFILE
mv $ORDER $UT
$ECHO "Ferdig med behandling av $ORDER..." >>$LOGFILE
$ECHO "" >>$LOGFILE
rm -rf $LOCKFILE
else
$ECHO ""
$ECHO "Start-fil er IKKE funnet i ordre $ORDER." >>$LOGFILE
$ECHO ""
fi
done


Hadde satt stor pris på litt hjelp :-)

Brukerens avatar
medlem i 213 måneder
 

Innleggav beltazore » fre 08.09.2006 12:06

ECHO="/bin/echo"
TOUCH="/bin/touch"
MOGRIFY="/usr/bin/mogrify"
RM="/bin/rm"

Første tips:

Disse trenger du ikke å bruke som variabler. De kan brukes uten å bli satt som variabler så lenge de ligger i din path. Å bruke de som variabler gjør det bare mer rotete.

Andre tips, du gjør det vanskeligere enn du må:
Kode: Merk alt
for img in `ls *.jpg`
do
          convert -resize 800x600 $img $img
  done


Burde løse det. I alle fall lett å gå ut i fra den koden

Brukerens avatar
medlem i 231 måneder
 

Innleggav ehh » fre 08.09.2006 12:37

beltazore skrev:Andre tips, du gjør det vanskeligere enn du må:
Kode: Merk alt
for img in `ls *.jpg`
do
          convert -resize 800x600 $img $img
  done


Burde løse det. I alle fall lett å gå ut i fra den koden


Og setter du $img i anførselstegn har du løst problemet med mellomrom i filnavn:

Kode: Merk alt
for img in `ls *.jpg`
do
          convert -resize 800x600 "$img" "$img"
done

Brukerens avatar
medlem i 226 måneder
 

Innleggav beltazore » fre 08.09.2006 13:30

Mellomrom i filnavn? Skamme seg!

Brukerens avatar
medlem i 231 måneder
 

Innleggav Ogger » fre 08.09.2006 13:48

Og setter du $img i anførselstegn har du løst problemet med mellomrom i filnavn:


er enig med beltazore .
hvorfor trenge de ?

Brukerens avatar
medlem i 218 måneder
 

Innleggav beltazore » fre 08.09.2006 17:06

Tror du missforstod meg Ogger. Jeg skjønner ikke hvorfor man skal bruke mellomrom i filenavn. Det blir rotete og usystematisk! Det blir også mer tungvindt å håndtere.

Brukerens avatar
medlem i 231 måneder
 

Innleggav Ogger » man 11.09.2006 8:39

var akkurat de samme jeg tenkte .

Brukerens avatar
medlem i 218 måneder
 

Takk for tilbakemeldinger.

Innleggav kennethr » tir 12.09.2006 21:57

Takk for alle tilbakemeldinger.
Har vært offline noen dager så jeg kom frem til en løsning før jeg fikk lest alle innlegg (takket være "man" :-) .

Resutatet ble slikt:

#!/bin/bash

# Variabler
ECHO="/bin/echo"
TOUCH="/bin/touch"
MOGRIFY="/usr/bin/mogrify"
RM="/bin/rm"
INN="/ordre/inn"
UT="/ordre/ut"
LOCKFILE="/ordre/lock.lck"
LOGFILE="/ordre/log.txt"
ORDERS=`ls $INN`


# Script start

cd $INN

if [ -e "$LOCKFILE" ]; then
$ECHO "Scriptet kjører allerede..." >>$LOGFILE
exit
fi

$TOUCH $LOCKFILE

for ORDER in $ORDERS; do
if [ -e "$INN/$ORDER/transfer" ]; then
$ECHO "Start-fil funnet for ordren $ORDER." >>$LOGFILE
cd $INN/
$ECHO "Roterer $ORDER..." >>$LOGFILE
find "$ORDER" -iname \*.jpg -exec mogrify {} -rotate "-90<" {} \;
$ECHO "Ferdig med rotering av $ORDER..." >>$LOGFILE
$ECHO "Resizer $ORDER..." >>$LOGFILE
find "$ORDER" -iname \*.jpg -exec mogrify {} -resize x1200 {} \;
$ECHO "Ferdig med resizing av $ORDER..." >>$LOGFILE
$ECHO "Flytter $ORDER til UT mappe..." >>$LOGFILE
mv $ORDER $UT
$ECHO "Ferdig med behandling av $ORDER..." >>$LOGFILE
$ECHO "" >>$LOGFILE
rm -rf $LOCKFILE
else
$ECHO ""
$ECHO "Start-fil er IKKE funnet i ordre $ORDER." >>$LOGFILE
$ECHO ""
fi
done


Er enig i at unødvendige variabler får scriptet til å se rotete ut, og skal skrive det opp bak øret til neste gang.

Mellomrom i filnavn er noe dritt, men det er ikke så mye en kan gjøre med det når det er kunder som gir navn til filene.

Mvh
Kenneth

Brukerens avatar
medlem i 213 måneder
 

Innleggav bringebaer_ » tir 28.11.2006 18:01

Perl versjon av scriptet ovenfor, sånn bare for gøy :)

Kode: Merk alt
use strict;
use warnings;
use Carp;

my $in = "/tmp/inn";
my $out = "/tmp/ut";
my $lock = "/tmp/bilde.lock";
my $log = "/tmp/bilde.log";

# Lås, dø hvis låst, lås hvis ikke.
if (-e $lock) {
   croak "kjører allerede"
}
else {
   open my $fh, ">", $lock
      or croak "Klarer ikke å låse fil";
   close $fh;
}

# Les innmappen og utfør modifikasjoner
opendir my $inbox, "$in/"
   or &nice_die("Klarte ikke å åpne in mappe.");

foreach my $order (readdir($inbox)) {
   next unless $order =~ /jpg$/;

   &log("Roterer og resizer $order");
   `convert -rotate "-90" -resize x1200 $in/$order $out/$order`;

   &log("Sletter $order fra in");
   unless (-e "$out/$order") {
      &nice_die("Fil finnes ikke i ut, avbryter slett");
   }
   else {   unlink "$in/$order";  }
}
&log("Ferdig.");
unlink $lock;

sub log {
   open my $logfil, ">>$log"
      or carp "klarte ikke å åpne logfil $log";
   print $logfil @_, "\n";
   close $logfil;
}

sub nice_die {
   unlink $lock;
   croak @_;
}
medlem i 208 måneder
 

Innleggav nc » tir 28.11.2006 18:49

Og i php

Kode: Merk alt
 foreach(glob("*.*") as $fileName) {
        $fileType = exif_imagetype($fileName) ;
        if (is_int($fileType)) {
                if (!is_file("resize_".$fileName)) {
                        echo "Generating Thumbnail of \"".$fileName."\": " ;
                        `convert -size 128x96 "$fileName" -resize 128x96 "resize_"."$fileName"` ;
                        if (!is_file("resize_".$fileName)) {
                                echo errorColor("Permission Denied") ;
                        } else {
                                echo successColor("ok") ;
                        }
                        echo ".<br>\n" ;
                }
         }
}

Erfaren
Brukerens avatar
medlem i 230 måneder
 

Innleggav fdahl_009 » tir 28.11.2006 18:57

Hehe.. Når kommer den i BASIC da tro?? ;)
medlem i 218 måneder
 

Innleggav kennethr » ons 29.11.2006 9:34

Veldig hyggelig å se at noen blåser liv i denne gamle tråden!
Noen som bruker scriptet til noe?

Brukerens avatar
medlem i 213 måneder
 

Innleggav bringebaer_ » tor 30.11.2006 13:39

kennethr skrev:Veldig hyggelig å se at noen blåser liv i denne gamle tråden!
Noen som bruker scriptet til noe?


Litt vanskelig å finne burksområde for det, er nysjerrig på hva du bruker det til :)

Ellers kan det jo brukes som et rammeverk til å kjøre operasjoner på alle filer i en mappe, det får man bruk for til tider.
medlem i 208 måneder
 

Bruksområder.

Innleggav kennethr » tor 30.11.2006 16:31

bringebaer_: Litt vanskelig å finne burksområde for det, er nysjerrig på hva du bruker det til :-)

Se for deg at 1200 pixels på den korteste siden av et bilde er det du trenger for å kunne lage ett bilde i 10x13 cm uten tap i kvalitet og at maskinen som skal lage bildet går 50-60% raskere hvis du reduserer fra f.eks 3000x til 1200x.

Se for deg at du har en nettløsning hvor bildefilene blir levert inn, og de blir automatisk overført til en linux filtjener som kjører dette scriptet i en cronjob.

Der har du ett bruksområdet...

Brukerens avatar
medlem i 213 måneder
 


Returner til Utvikling i Linux



Hvem er i Forumene

Registrerte brukere: Google [Bot]