TD1

Exercice 1

Ecrire un script mmv qui permet le renommage multiple. Il prend en argument 2 chaines de caractères, string1 et string2, et transforme tous les fichiers du type string1.* en string2.*.

mmv

#!/bin/bash

# verification du nombre d'arguments

if test $# != 2 
then
    echo Mauvaise utilisation de mmv
    echo Usage:
    echo   mmv source cible
    exit 1
fi

SOURCE=$1
CIBLE=$2
for ANCIENNOM in ${SOURCE}.*
do
    NOUVEAUNOM=`echo ${ANCIENNOM} | sed -e "s/${SOURCE}/${CIBLE}/"`
    mv ${ANCIENNOM} ${NOUVEAUNOM}
done

Exercice 2

Créer un script cmprm qui compare deux fichiers et efface le second fichier si celui-ci est identique au premier.

Créer un script comparerm qui compare récursivement deux répertoires et efface dans le second répertoire tous les fichiers identiques au premier (même fichier dans répertoire de même chemin relatif).

cmprm

#!/bin/bash

cmp $1 $2 > /dev/null && rm $2

comparerm

#!/bin/bash

dir1=$1
dir2=$2

pwd_original=$PWD

cd $dir1
dir1=$PWD

cd $pwd_original
cd $dir2

find . -type f -exec ~/exo2/cmprm $dir1/{} {} \; -print 2> /dev/null

Exercice 3

Créer deux scripts poubelle et recupere qui permettent respectivement de mettre à la poubelle un fichier (ou un ensemble de fichiers ou de repertoires) ou de replacer dans son repertoire initial un fichier mis à la poubelle.

poubelle

#!/bin/bash

TRASH=/home/lambda/.poub
mkdir -p $TRASH

CURRENTDIR=$PWD
for file in $@
do
    echo direction poubelle: $file
    # on va dans le repertoire de $file
    cd `dirname $file`
    # on recupere le nom de ${file} dans le repertoire
    file=`basename $file`
    # on cree le repertoire ad-hoc dans la poubelle
    TRASHDIR=${TRASH}/.${PWD}
    mkdir -p ${TRASHDIR}
    # on transfere le fichier
    mv $file ${TRASHDIR}
    # passage au suivant
    cd $CURRENTDIR
done

recupere

#!/bin/bash

TRASHDIR=/home/lambda/.poub
echo Poubelle: $TRASHDIR

# deux possibilites:

# 1) on est dans la poubelle et on veut remettre un fichier a sa place
# 2) on n'est pas dans la poubelle et on veut remettre le fichier en argument (s'il existe !)

CURRENTDIR=$PWD
echo CWD: $CURRENTDIR
for file in $@
do
    echo Fichier a recuperer: $file
    # situation 1) ou 2)
    FILEDIR=${CURRENTDIR}/`dirname $file`

    if test `echo ${FILEDIR} | grep ${TRASHDIR} `
    then
    # situation 1)
    POUBDIR=${FILEDIR}
    else
    # situation 2)
    POUBDIR=${TRASHDIR}${FILEDIR}
    fi
    file=`basename $file`

    echo Localisation: ${POUBDIR}/${file}
    # recuperation du repertoire du fichier
    # il faut enlever ${TRASHDIR} de ${POUBDIR}
    #CHARTRASHDIR=`echo ${TRASHDIR} | wc -c | awk '{print $1+1}'`
    CHARTRASHDIR=`echo ${TRASHDIR} | wc -c `
    BACKDIR=`echo ${POUBDIR} | cut -c$CHARTRASHDIR- `
    echo Repertoire cible: ${BACKDIR}
    # creation du repertoire
    mkdir -p ${BACKDIR}
    # recuperation du fichier
    echo mv ${POUBDIR}/${file} ${BACKDIR}
    mv ${POUBDIR}/${file} ${BACKDIR}

done

Exercice 4

Créer un script lower.sh qui renomme le nom d'un fichier en minuscule (utiliser la commande tr). Ce script doit être valable dans le cas où l'argument contient un nom de répertoire.

lower.sh

#!/bin/bash

for file in $@
do
    newfile=`echo "$file" | tr '[A-Z]' '[a-z]'`
    if test $newfile != $file
    then
     echo mv $file $newfile
    fi
done

Exercice 5

Créer un script gaussian_opt.sh qui va afficher la progression d'une optimisation de géométrie sous Gaussian.

Exemple de fichier Gaussian: propanal-3.txt

gaussian_opt.sh

#!/bin/bash

# if first argument is -N where n is an integer,

# output only the last N

logfile="$1"
firstchar=`echo "$logfile" | cut -c1`
nextchars=`echo "$logfile" | cut -c2-`
if [ a"$firstchar" == "a-" ]
then
    shift
    logfile=$1
    grep "Maximum Force"        $logfile |cut -c27-55 | tail -n $nextchars > /tmp/tmp.$$-a
    grep "RMS     Force"        $logfile |cut -c27-55 | tail -n $nextchars > /tmp/tmp.$$-b
    grep "Maximum Displacement" $logfile |cut -c27-55 | tail -n $nextchars > /tmp/tmp.$$-c
    grep "RMS     Displacement" $logfile |cut -c27-55 | tail -n $nextchars > /tmp/tmp.$$-d
    grep " SCF Done:"           $logfile |cut -c27-40 | tail -n $nextchars > /tmp/tmp.$$-e
else
    grep "Maximum Force"        $logfile |cut -c27-55 > /tmp/tmp.$$-a
    grep "RMS     Force"        $logfile |cut -c27-55 > /tmp/tmp.$$-b
    grep "Maximum Displacement" $logfile |cut -c27-55 > /tmp/tmp.$$-c
    grep "RMS     Displacement" $logfile |cut -c27-55 > /tmp/tmp.$$-d
    grep " SCF Done:"           $logfile |cut -c27-40 > /tmp/tmp.$$-e
fi



echo "-----------------------------------------------------------------------------------------------------------------------"
echo "        Maximum Force        |          RMS Force          |     Maximum Displacement    |       RMS Displacement      "
echo "-----------------------------------------------------------------------------------------------------------------------"
echo "  Value     Threshold  Conv.?|  Value     Threshold  Conv.?|  Value     Threshold  Conv.?|  Value     Threshold  Conv.?"
echo "-----------------------------------------------------------------------------------------------------------------------"
paste -d"|" /tmp/tmp.$$-{a,b,c,d,e}
echo "-----------------------------------------------------------------------------------------------------------------------"

/bin/rm -f /tmp/tmp.$$-*

Exercice 6

Créer une série de script addcd, rmcd, lscd permettant respectivement de stocker des répertoires (courant), de les effacer, et de les lister.

Usage:

# on va dans un repertoire
cd /home/lambda/titi/toto/tata
# on sauvegarde le repertoire courant en lui donnant un nom
addcd tata
# on part ailleurs
cd /tmp
# on liste les repertoires en memoire
lscd
# on y va
. tata
# on efface le repertoire de la memoire
rmcd tata

addcd

#!/bin/bash

# preambule: 

# 1) le repertoire $HOME/.cd doit être rajouté dans le PATH
# 2) les scripts addcd, lscd et rmcd sont placés dans $HOME/.cd

echo cd $PWD > $HOME/.cd/$1
chmod +x $HOME/.cd/$1

lscd

#!/bin/bash

cd ~/.cd
for i in *
do
    case "$i" in 
    ( "addcd" | "lscd" | "rmcd" )
      ;;
    ( * )
      echo $i `cat $i`
      ;;
    esac
done

rmcd

#!/bin/bash

rm $HOME/.cd/$1