Étant donné les références (et droits d'accès associés) suivantes :
drwxr-xr-x 32 root sys 1024 mai 3 2001 / drwxr-xr-x 4 root sys 4096 jan 12 04:05 /users drwxr-x--x 49 root sys 4096 jan 12 04:05 /users/home drwxr-x--x 47 yunes ens 4096 jan 12 04:05 /users/home/yunes -rw-r----- 1 yunes staff 512 mai 3 2001 /users/home/yunes/bidule drwxrwxr-x 2 root sys 512 jan 12 04:05 /users/home/yunes/subdir
Soit le programme suivant dont l'exécutable correspondant s'appelle truc :
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> int main(char *argv[]) { int d; char c; d = open("fic",O_RDWR); if (d==-1) exit(EXIT_FAILURE); while ( 1 ) switch (read(d,&c,1)) { case -1: close(d); exit(EXIT_FAILURE); case 0: close(d); exit(EXIT_SUCCESS); case 1: if (write(d,&c,1)!=1) { close(d); exit(EXIT_FAILURE); } break; } }
int main(char *argv[]) { int d1, d2; char c; d1 = open("fic",O_RDONLY); if (d1==-1) exit(EXIT_FAILURE); d2 = open("fic",O_WRONLY); if (d2==-1) { close(d1); exit(EXIT_FAILURE); } while ( 1 ) switch (read(d1,&c,1)) { case -1: close(d1); close(d2); exit(EXIT_FAILURE); case 0: close(d1); close(d2); exit(EXIT_SUCCESS); case 1: if (write(d2,&c,1)!=1) { close(d1); close(d2); exit(EXIT_FAILURE); } break; } }
Autrement dit, il s'agit de déplacer une sous-partie de l'arbre <dir> vers la <destination>. La sous-partie étant définie par le critère que doivent vérifier les références de fichier de l'arbre.
Par exemple : la commande range /ens/yunes -s .c /ens/yunes/sources
déplacera les fichiers
/ens/yunes/truc.c et
/ens/yunes/projet/systeme/main.c vers /ens/yunes/sources/truc.c
et
/ens/yunes/sources/projet/systeme/main.c
Les critères possibles sont -p <préfixe> ou -s <suffixe>. Donc permettent de contrôler si une référence de fichier commence ou termine par une chaîne de caractères donnée.
Pour cela, on pourra utiliser la fonction char *strstr(char *s1,char *s2) qui renvoie le pointeur dans s1 qui correspond à la localisation de s2 (et NULL sinon) :
char *s1 = "tout va bien"; strstr(s1,"va")==s1+5 strstr(s1,"alors c'est ou ?")==NULL