Programeer opdrachtenOpdracht : opdr3_ptr.txt

Terug naar de inzendingen
Opdracht 3,Peter Postma
9-Feb-2005
 Toen ik opdracht 3 doorlas dacht ik meteen: dit is iets voor een shell script!
 Smile
 Voor dit soort problemen zijn shell scripts vaak erg krachtig.
 Het gebruik is simpel:
 
 ./opdracht3.sh directory
 
 In het script kunnen 2 dingen ingesteld worden:
 
 * prefix: geeft aan waarmee een bestandsnaam mee moet beginnen.
 
 * length: geeft aan hoeveel getallen er in een bestandsnaam moet komen.
 
 Als je bv. prefix="foto" hebt en length="4", dan worden de bestandsnamen
 zo gevormd: foto0001.*, foto0002.*, etc.
 
 Wanneer er meer dan het ingestelde aantal bestanden in een directory zijn
 (bv. bij length="4", meer dan 9999), dan zal het script vanzelf stoppen als
 dit aantal wordt overschreden. De gebruiker zal dan zelf de "length" groter
 moeten maken. Er is voor deze manier gekozen om onbedoelde situaties te
 voorkomen.
 
 Als "length" wordt veranderd en het script wordt opnieuw gedraaid, dan zal
 het script er ook voor zorgen dat de bestanden weer het ingestelde aantal
 getallen krijgen.
 1 
*****opdracht3.sh****
  
 2#!/bin/sh
 3#
 4# Bestand:      opdracht3.sh
 5# Beschrijving: Pascals Programmeeropdracht 3 (foto's).
 6# Taal:         sh (POSIX shell)
 7# Datum:        9 Februari 2005 11:02
 8# Auteur:       Peter Postma 
 9# Licentie:     Geen (public domain)
 10#
 11
 12# Prefix, waarmee een bestandsnaam moet beginnen.
 13prefix="foto"
 14
 15# Aantal getallen dat gebruikt moet worden in de bestandsnamen.
 16# Als er grotere getallen benodigd zijn (bv. > 9999) dan stopt dit script
 17# automatisch. U moet er dus zelf voor zorgen dat de lengte groot genoeg is!
 18length="4"
 19
 20# Check argument.
 21if [ $# -ne 1 ]; then
 22        echo "Syntax: $0 directory"
 23        exit 1
 24fi
 25
 26# Check of het argument een directory is.
 27if [ ! -d "$1" ]; then
 28        echo "Ongeldige directory: $1"
 29        exit 1
 30fi
 31
 32# Ga deze directory in.
 33cd $1 > /dev/null 2>&1
 34if [ $? -ne 0 ]; then
 35        echo "Geen toegang tot directory: $1"
 36        exit 1
 37fi
 38
 39count=1
 40# Lees alles in de huidige directory.
 41for file in *; do
 42        # Alleen bestanden zijn geldig, sla de rest over.
 43        if [ ! -f "${file}" ]; then
 44                continue
 45        fi
 46        # Check of dit bestand al is omgezet. Er wordt niet alleen naar
 47        # de prefix gekeken, maar ook naar het aantal getallen in het bestand.
 48        # Bij het veranderen van 'length' zal dit script er voor zorgen dat
 49        # de bestanden ook weer het ingestelde aantal getallen krijgen.
 50        check="${file%.*}"
 51        suffix="${check#${prefix}}"
 52        if [ "${check}" != "${suffix}" -a ${#suffix} -eq ${length} ]; then
 53                continue
 54        fi
 55        # Verkrijg de extensie van dit bestand.
 56        extension="${file##*.}"
 57        # Loop net zo lang totdat we een nog niet bestaand bestand hebben.
 58        ready=0
 59        while [ $ready -eq 0 ]; do
 60                # Bereken hoeveel nullen er in de naam komen.
 61                suffix=""
 62                len=$((${length} - ${#count}))
 63                while [ $len -gt 0 ]; do
 64                        suffix="${suffix}0"
 65                        len=$(($len - 1))
 66                done
 67                # Als het aantal negatief wordt dan is 'length' te klein.
 68                if [ $len -lt 0 ]; then
 69                        echo "Teveel bestanden in deze directory (> $count)."
 70                        exit 1
 71                fi
 72                # Maak een nieuwe bestandsnaam.
 73                new="${prefix}${suffix}${count}.${extension}"
 74                # Bestaat er al een bestand met dit nummer?
 75                if [ ! -f "${new%.*}".* ]; then
 76                        # Nieuwe bestand bestaat nog niet, hernoem naar deze.
 77                        echo "${file} -> ${new}"
 78                        mv "${file}" "${new}"
 79                        ready=1
 80                fi
 81                # Volgend nummer.
 82                count=$(($count + 1))
 83        done
 84done
 85
 86# Einde script.
 87exit 0
 
 
Mijn commentaar
 
 Je conclusie een scripttaal te gebruiken kan ik enkel bevestigen.
 De keuze voor shellscript vind ik heel moedig, ik had het zo niet eens willen proberen.
 n regel 74-79 los je keurig het probleem op waar het hier eigenlijk om gaat,
 n.l. het voorkomen van overschrijven van bestanden.
 Ik ben enigzinds onder de indruk van het gemak waarmee jij met shellscript
 omgaat
 Code ziet er netjes, leesbaar en gedocumenteerd uit.
 Ben aleen niet zo kapot van die [I]continue[/] constructies op regels 43 en
 52.