chmod g+w fic1
chmod uog+x script
chmod u-wx toto
chmod og+wx toto
C'est l'option -R
. Par exemple, pour interdire tous les
droits aux fichiers présents dans une branche du répertoire
confidentiel
, on peut faire :
chmod -R og-rwx confidentiel
C'est l'option -m
qui permet de le faire. Par exemple, pour
créer un répertoire en lecture interdite aux autres :
mkdir -m og-r repertoire
bireme ~ $ ll /usr/sbin/mount
-r-xr-xr-x 1 root bin 27208 Jan 9 2000 /usr/sbin/mount*
Il s'agit d'un fichier éxécutable par tout utilisateur.ln tmp/bidon bloLes contenus sont identiques. Les noms de fichiers
tmp/bidon
et blo
renvoient au même endroit sur le disque dur.
ln -s tmp/bidon bloLe contenu semble être identique, cependant, à propos du
blo
, le disque dur ne contient comme information que le nom
du fichier vers lequel le lien pointe (tmp/bidon
).
On vient d'en voir une. On en déduit que le temps d'accès au contenu d'un lien dur est plus rapide que pour un lien symbolique. Une autre différence notable est que, contrairement aux liens symboliques, un lien dur ne peut pas pointer vers un répertoire.
On ne peut pas faire de lien dur vers un répertoire. Dans ce cas, il faut donc utiliser un lien symbolique.
S'il s'agit d'un lien dur, les droits des deux fichiers liés sont modifiés. En revanche, s'il s'agit d'un lien symbolique, les deux fichiers peuvent avoir des droits différents.
bireme ~ $ ps PID TT S TIME COMMAND 16970 pts/2 S 0:00 /usr/local/util/bin/zsh4 16992 pts/2 S 0:07 vim systeme-sol.tml 17382 pts/3 R 0:00 /usr/local/util/bin/zsh4 bireme ~ $ ps -l F UID PID PPID %C PRI NI SZ RSS WCHAN S TT TIME COMMAND 8 9625 16970 16967 0 48 20 4032 3152 mutex_ex S pts/2 0:00 /usr/local/u 8 9625 16992 16970 1 58 20 4312 3760 mutex_ex S pts/2 0:07 vim systeme- 8 9625 17382 17379 0 48 20 3912 2840 mutex_ex S pts/3 0:00 /usr/local/u
Les numéros apparaissant dans la colonne PID sont les numéros des différents processus. Le PPID désigne lui le numéro du processus père du processus en question. Par exemple, ici, le processus 16992 (vim) est un fils du processus 16970 (zsh).
Pour envoyer un signal à un processus, on peut faire :
bireme ~ $ kill -23 17382
17382 désignant un numéro de processus (PID) et 23 le numéro d'un signal (SIGSTOP).
Le processus est tué sans pouvoir de défendre.
Le processus s'interrompt.
Le processus interrompu redémarre.
bireme ~ $ nice -19 ./calcul
Pour vous aider à comprendre, vous pouvez afficher un arbre en lançant la commande pstree (FreeBSD) ou ptree (Solaris).
Ce sont les processus associés aux commandes ps et wc que vous venez de lancer !
Vous disposez des commandes fg et bg. fg permet de poursuivre le déroulement du programme. bg le fait aussi mais il relance le programme en tâche de fond.
Il faut éditer un fichier saluer et le rendre ensuite éxécutable :
#!/bin/sh if [ -n "$1" ]; then LOGIN=$1; else LOGIN=`whoami`; fi echo "Bonjour, $LOGIN"
chaland ~ $ params bla ble bli blo blu
La commande params a 5 paramètre(s), que voici : bla ble bli blo blu
#!/bin/sh echo "La commande $0 a $# paramètre(s), que voici| : $@"
#!/bin/sh echo "J'ai reçu $# arguments" echo "Le premier d'iceux est $1"
drakkar ~ $ combien galion Il y a 5 personne(s) loguées sur galion en ce moment. drakkar ~ $
#!/bin/sh N=`who | wc -l | sed -e "s/ *//"` MACHINE=`whoami` echo "Il y a $N personne(s) logués sur $MACHINE en ce moment"
Le script suivant lancé avec "**/*.htm" comme paramètre devrait fonctionner :
#!/bin/sh for i in $@; do mv $i `echo $i | sed -e "s/htm$/html/"` done;
#!/bin/sh for i in $@; do mv $i `echo $i | tr '[:upper:]' '[:lower:]'` done;
indice toto tata titi toto tutu
renvoie l'indice de toto dans la liste tata titi toto tutu, c'est-à-dire 3.
#!/bin/sh ARG=$1 shift N=0 for i in $@; do N=`expr $N + 1` [ x$ARG = x$i ] && echo $N done;
Dans ce fichier, vous avez : 45 mots contenant «r», «s» ou «t», et parmi eux, 12 contiennent deux de ces lettres au moins. Il y a aussi 10 mots ne contenant aucune voyelle.
#!/bin/sh RST=`grep "[rst]" $1 | wc -l` DEUX=`grep "[rst].*[rst]" $1 | wc -l` CONS=`grep -v "[aeiou]" $1 | wc -l` (echo "Dans ce fichier, vous avez| :"; echo "$RST mots contenant «r», «s» ou «t» et parmi eux,"; echo "$DEUX contiennent deux de ces lettres au moins."; echo "Il y a aussi $CONS mots ne contenant aucune voyelle.") | sed -e "2,3s/^ *// \$s/i */i /"
On veut aussi que le résultat soit placé dans un fichier, et que le résultat soit classé : toutes les lignes qui contiennent «air», puis toutes celles qui contiennent «eau», etc.
#!/bin/sh FICHIER=resultat MOTS="terre air eau feu" [ -w $FICHIER ] && echo "Le fichier $FICHIER existe déjà" && exit 1 for i in $MOTS; do echo "Lignes contenant $i" >> $FICHIER grep $i zola*.txt >> $FICHIER echo >> $FICHIER done;
#!/bin/sh FICHIER=resultat [ -w $FICHIER ] && echo "Le fichier $FICHIER existe déjà" && exit 1 for i in zola[345].txt; do echo "Dans le fichier $i, voici les lignes contenant «mine»" >> $FICHIER NB=`grep -n mine $i | tee -a $FICHIER | wc -l` (echo "$NB lignes";echo ) >> $FICHIER done;
coupe fic 4 8
affichera les lignes 4 à 8 du fichier fic. Affichez des messages en cas d'erreur (nombre de paramètres incorrect, fichier inexistant, etc).
#!/bin/sh [ $# != "3" ] && echo "Nombre de paramètres incorrects" && exit 1 [ ! -r $1 ] && echo "Fichier $1 inexistant" && exit 1 cat $1 | sed -n -e "$2,$3p"
tar zcvf nouveaunom fichiersaregrouper
Avant d'envoyer des fichiers tar, on utilise uuencode.
Écrivez une commande tarmail qui prend deux arguments, une adresse et un nom de répertoire, et qui envoie par mail le contenu de l'arborescence du répertoire précédée d'un message expliquant comment la récupérer.
Note : pour récupérer un fichier uuencodé, on tape uudecode et pour reconstruire l'arborescence, on utilise tar zxvf fichier.
(echo "To: $1"; echo "Subject: $2"; echo " Pour lire ce document, sauvegardez ce mail (par exemple sous le " echo "nom bidule) et faites "; echo "uudecode bidule | tar tvzf -"; echo "pour récupérer les fichiers du répertoire $2"; tar cvf - $2 | gzip | uuencode /dev/stdout) | mail $1
find . -name '*~'
Écrivez un script qui prend en argument un nom de répertoire et qui détruit tous les fichiers :
#!/bin/sh for i in `find . \( -name '*~' -o -name 'core' -o -name 'a.out' -o -name '#*#' \) -type f` ; do rm -f $i done;
#!/bin/sh if [ $# != "1" ]; then echo "Indiquez un nom de fichier";exit 1; fi if [ ! -r $1 ]; then echo "Fichier $1 inexistant";exit 1; fi TRAVAIL=$1 while true; do read CMD case $CMD in end) exit 0;; cherche) echo -n "Motif ? ";read MOTIF; echo -n "Fichier ? ";read FICHIER; if [ -w $FICHIER ]; then echo "Le fichier $FICHIER existe déjà"; else grep $MOTIF $TRAVAIL > $FICHIER fi ;; tete|fin) echo -n "Lignes ? ";read LGN; echo -n "Fichier ? ";read FICHIER; if [ -w $FICHIER ]; then echo "Le fichier $FICHIER existe déjà"; else case $CMD in tete) head -n $LGN < $TRAVAIL > $FICHIER;; fin) tail -n $LGN < $TRAVAIL > $FICHIER;; esac fi ;; *) echo "Commande inexistante";; esac done