Gå til innhold

Bash-script, trenger litt hjelp


Anbefalte innlegg

Hei.

Jeg er en fersk bruker av Fedora Core 2. Skal lage et bash-script som heter "finn", som skal sjekke om en fil finnes i en katalog. Det kan startes f.eks. som; finn <fil> <katalog>.

Hvis katalogen ikke finnes, returneres beskjed om dette. Hvis katalogen finnes, søkes fila opp, og skriver til skjerm hvor katalog og fil er lagret.

 

Er det noen som har noen forslag til problemet, setter jeg stor pris på det.

 

Takker for svar.

Ørjan

Lenke til kommentar
Videoannonse
Annonse

#!/bin/env bash

if [ ! -d $1 ]; then
 echo katalogen $1 finnes ikke
else
 if [ -f $1/$2 ]; then
   echo filens finnes under $1/$2
 else
   echo katalogen $1 finnes, men ikke filen $2
 fi
fi

 

Burre

Endret av burre
Lenke til kommentar
#!/bin/env bash
# Kjapp versjon

[ -f $1/$2 ] && echo finnes under $1/$2  || echo finnes ikke

#litt mer lesbar

if [ -f $1/$2 ]; then
 echo filen finnes under $1/$2
else
 echo filen finnes ikke
fi

Burre

*mumle* Upedagogisk metode *mumle*

Takker for svar.

Kjapp metoden virker veldig bra, med svar om filen ikke finnes. Den andre metoden hadde

problemer med å oppgi at filen ikke fantes. Jeg skal også "bake" inn om det skal søkes rekursivt. Skal prøve på det. Hvis noen har tips i den sammenheng også, så er jeg veldig åpen for forslag.

 

Takker.

Ørjan

Lenke til kommentar

Hei igjen.

Med andre ord:; Hvis jeg vil starte scriptet f.eks. finn [-r] <fil> <katalog> .

 

[-r] betyr at '-r' kan være med, men ikke nødvendigvis. Hvis '-r' (for rekursivt) er med, skal scriptet også

sjekke om fila finnes i eventuelle underkataloger til den katalogen som er oppgitt. Hvis '-r' ikke er med,

skal bare den aktuelle katalogen sjekkes.

 

Fantastisk hvis noen har løsningen til dette!!! Vanskelig for en nybegynner.

 

Takker igjen.

Ørjan

Lenke til kommentar

Oppdaterte kodesnuttet til å begynne med slik at den virker slik som du vil ha den.

 

Dersom du skal parse rekursivt så tror jeg at det kan lønne seg med kommandoen find.

 

Alle kommandoer slutter med en exit kode, som er $?

 

0 er ok utført.

 

Denne kodebiten finner duplikater, f.eks

 

foo1/fil og

foo2/fil

 

#!/bin/env bash

export IFS=''

filen=$(find $1 -type f -iname $2 2> /dev/null)

if [ $? == 1 ]; then
 echo Fant ikke katalog $1. prøv . for søk i denne katalogen.
 exit 1
fi

if [ -n $filen ]; then
 export IFS=' '
 echo "fant filen(e) :"
 for i in $filen; do
   echo $i
 done
fi

 

Liten advarsel, er ikke sikker på 'korrekt' bruk av IFS.

 

Aaaarg, du skulle ha med -r for rekursivt ja, skal se på om bash har noen opsjonsparser eller om jeg må skrive noe selv.

 

Føler meg tryggere i python en bash for tiden ;)

 

Burre

Endret av burre
Lenke til kommentar

#!/bin/bash

if getopts r opts; then
 case $opts in
   r) r=true;;
 esac
fi

if [ ! -z $r ]; then
 shift
 DIRS=$(find $2 -type d)
else 
 DIRS=$2
fi

for DIR in $DIRS
do 
 DIR=$(dirname $DIR)
 if [ -f "${DIR}/$1" ]; then 
   echo "${DIR}/$1"
   FUNNET=true
 fi
done

if [ -z $FUNNET ]; then
 echo "Den fordømte fila finnes ikke"
 exit 1
fi

exit 0

 

Forholdsvis selvforklarende løsning på et i utgangspunktet teit problem

Lenke til kommentar

Hum.. litt kaffe og en røyk, så fikk jeg ånden over meg og implementerte find som en rekursiv funksjon i sh i stede. Dermed er man ikke avhengig av noe annet en et Bourne shell (funker i ash, dash og bash iallefall) og en core-pakke (coreutils på Debian GNU/Linux)

 

!/bin/sh

find() {
 if [ ! -d "$1" ]; then 
   return
 fi
 for FILE in ${1}/*; do
   if [ -d "$FILE" ]; then 
     echo $FILE;
     find "$FILE"
   fi
 done
}

if getopts r opts; then
 case $opts in
   r) r=true;;
 esac
fi

if [ ! -z $r ]; then
 shift
 DIRS=$(find "$2")
else 
 DIRS=$2
fi

for DIR in $DIRS
do 
 if [ -f "${DIR}/$1" ]; then 
   echo "${DIR}/$1"
   FUNNET=true
 fi
done

if [ -z $FUNNET ]; then
 echo "Den fordømte fila finnes ikke"
 exit 1
fi

exit 0

 

*puh* da er det bare å ta helg :-)

Endret av runesk
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...