Solution de l'exercice 1

1.1 Recherche de sushi

La solution est ma foi assez simple et repose sur l'utilisation de find avec -perm et -user dans le prédicat. La ligne de commande suivant montre comment supprimer de tels fichiers, en se basant sur le fait que les répertoires des utilisateurs sont situés sous /home

find /home \(-user root -o -user bin \) -perm -4111 -exec rm {} \;

1.2 Utilisation conjointe de tar, find et xargs

Il n'est guère compliqué de rechercher les fichiers correspondant aux conditions :

Nous obtenons finalement l'expression suivante que, dans la suite de l'exercice, nous appellerons A :

find . -type f -mtime +30 -ctime +6 \( -name "*.c" -o -name "*.h"\)  -print

Passons désormais à la partie archivage :

tar cvf archive.tar `A`
rm -f archive.tar
touch archive.tar
find -type f -mtime +30 -ctime +6 \( -name "*.c" -o -name "*.h"\)  -exec tar rvf archive.tar {} \;
rm -f archive.tar
touch archive.tar
A | xargs ./auxiliaire archive.tar
Constitution du script temporaire nommé auxiliaire
#!/bin/ksh
ARCHIVE=${1}
shift
if [[ -f ${ARCHIVE} ]]
then
  tar rvf ${ARCHIVE} $*
else
  tar cvf ${ARCHIVE} $*
fi

Solution de l'exercice 2

Cet exercice est mon préféré ! En effet, il permet de faire, avec quelques astuces, des opérations délicates très efficacement !

  1. Constitution d'une archive et compression à la volée :
    tar cvf - rep | compress -9 - > archive.tar.Z
    La décompression et le désarchivage se font alors gràce à :
    zcat archive.tar.Z | tar xvfp -
    où, si l'on utilise gzip ou bzip2 (même syntaxe) :
    tar cvf - rep | gzip -9 - > archive.tar.gz
    gzip -d -c archive.tar.gz | tar xvfp -
    Par soucis de complétude, notons l'option z du tar de Linux qui permet d'intégrer la (dé)compression sans connecteur supplémentaire !
  2. Je décide de travailler avec gzip :
    tar cvf - rep | gzip -9 - | uuencode archive.tar.gz archive.tar.gz | mail -s "voila ton répertoire mon paulo !"
  3. Ici il faut utiliser un sous-shell (c'est à dire l'exécution d'une commande par un shell différent pour bien réaliser l'opération !)
    Supposons que vous disposiez de l'arborescence suivante :
    Et que vous souhaitiez transférer la sous arborescende de r3 vers v2, voici la solution à partir de /home :
    cd v1
    tar cvf - r3 | (cd /home/v2 ; tar xvfp -)

Etant irrémédiablement bavard, je me permets un petit commentaire sur le gain de place disque engendré, par exemple, par la décompaction / désarchivage en une seule opération. En effet, supposons que vous récupériez par ftp un fichier .tar.gz disons de 8Mo, contenant, par exemple, le code source de gcc. Si vous le décompressez avant de le désarchiver, vous avez besoin de stocker sur le disque le fichier tar décompressé avant de récupérer les fichiers eux mêmes ce qui peut suffire à combler votre partition !

Solution de l'exercice 3

L'expression régulière à construire est la suivante :

'(^|_)[([{]*[lL]apin[]{).,;]*(_|$)'

où nous avons remplacé le caractère espace par un souligné.

Ceci peut vous paraître compliqué mais se révèle en fait fort simple :