Bonjour, ô forum.
Dans mon post précédent, je me demandais comment tester si un objet présent dans un répertoire est un fichier ou un répertoire, sachant que j'écrivais un programme en bash.
Plus exactement, les deux tests que je veux écrire sont:
"si ce n'est pas un répertoire....."
"si ce n'est pas un fichier....."
En cherchant, j'ai fini pas trouver qu'il faut utiliser S_ISDIR et S_ISREG qui sont des macros décrites ici : http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man2/stat.2.(...)
Sauriez-vous comment il faut s"en servir?
Merci.
# Ben, man bash ...
Posté par Obsidian . Évalué à 2.
for i in *
do
[ -d $i ] || echo "$i n'est pas un répertoire"
[ -f $i ] || echo "$i n'est pas un fichier régulier"
done
Mais il me semble également avoir vu ce genre d'expression dans ton précédent script. Qu'est-ce qui ne fonctionne pas ?
[^] # Re: Ben, man bash ...
Posté par Obsidian . Évalué à 2.
Les macros en question sont simplement là pour contrôler l'état de tel ou tel flag, sans que tu aies besoin de connaitre ceux-ci en particulier.
[^] # Re: Ben, man bash ...
Posté par RobertRyan . Évalué à 2.
En fait, dans mon script précédent, j'avais fait ceci :
cd /home
for a in * ; do
# ignorer tous les objets qui ne sont pas des répertoires
if [ ! -d "$a" ] ; then
continue
fi
if [ "$a" = \* ] ; then
break
fi
cd "/home/$a"
for b in * ; do
# ignorer tous les objets qui ne sont pas des fichiers
if [ ! -e "$b" ] ; then
continue
fi
if [ "$b" = \* ] ; then
continue
fi
mais les tests sur les fichiers et les repertoires faisaient que le programme ne fonctionnaient pas bien. Je les ai donc supprimés.
Sinon, ta solution est peut-être juste, mais je ne la comprends pas bien. Et en quoi est-elle différente de la mienne?
[^] # Re: Ben, man bash ...
Posté par netsurfeur . Évalué à 3.
[^] # Re: Ben, man bash ...
Posté par Obsidian . Évalué à 2.
Bon la solution est quelque part dans la banquise du message précédent :
[ -e "$a" ] teste l'existence d'un « objet » sur ton filesystem.
[ -f "$a" ] teste si cette entrée est un fichier régulier ou pas.
Bon courage.
[^] # Script achevé
Posté par RobertRyan . Évalué à 1.
[^] # Re: Script achevé
Posté par -=[ silmaril ]=- (site web personnel) . Évalué à 1.
# Variables :
# a = répertoires des auditeurs sous /home
# b = rapports non classés
# c = nom de la société auditée
# d = numéro du dernier rapport classé
# e = extension du rapport
Aurait tu oublie la premiere maxime de la programmation utile:
"utiliser des noms de variables significatifs"
Autre chose:
tu a du cd "/home/Linux/Profils/" partout dans ton script, typiquement
une variable aurait ete tres utile au cas ou un changement du repertoire
de base arriverait.
Derniere chose:
Les shells utilisents des alias pour permettrent aux utilisateurs
de ne pas s'encombrer a retapper tout le temps les memes arguments
mais dans un script il est bon de passer outres ceux ci pour eviter un
maximum de comportement incoherents.
De plus tout les unix non pas forcement les memes emplacements
pour les commandes il est donc conseiller de creer des variables
pour toutes les commandes utilisées.
Ah et puis les cd dans un script c'est pas tres propre.
----------------------------------------------
#! /bin/bash
# Commandes
LS=/bin/ls
MV=/bin/mv
SED=/bin/sed
BASENAME=/usr/bin/basename
TAIL=/usr/bin/tail
MKDIR=/bin/mkdir
# Variables :
profils="/home/Linux/Profils"
rapports="/home/Linux/Rapports"
for auditeur in $profils/* ; do
# traiter uniquement les répertoires
if [ -d "$auditeur" ] ; then
for doc in $auditeur/* ; do
# traiter uniquement les fichiers
if [ -f "$doc" ] ; then
base=`$BASENAME $doc`
# on extrait du nom du rapport le nom de la société
# c'est à dire tout ce qui est avant le dernier point
societe=${base%*.*}
# on récupère l'extension du rapport à classer
# c'est à dire tout ce qui est après le dernier point
ext=.${base##*.}
# un répertoire au nom de la société existe-t-il déjà?
if [ -d "$rapports/$societe" ] ; then
# on extrait de la liste le numero du dernier fichier ajouté
# (celui dont le nombre est le plus grand)
d=$($LS -1 "$rapports/$societe" | $TAIL -1 | sed 's/*\.\([0-9]+\)\.*/\1/g')
# on incrémente ce numéro de 1
# on lui accolle 2 '0'
d=00$(($d + 1))
# on extrait les 3 premiers chiffres (à partir de la droite)
d=$(echo $d | sed 's/^0*\([0-9]\{3\}\)/\1/g')
# on déplace enfin le rapport du répertoire de l'auditeur
# dans le répertoire de la société en le renommant
$MV "$doc" $rapports/$societe/$societe.$d$ext"
else
# on crée un répertoire au nom de la société
$MKDIR "$rapports/$societe"
# on y déplace alors le rapport en lui attribuant le numéro '001'
$MV "$doc" "$rapports/$societe/$societe.001$ext"
fi
fi
done
fi
done
[^] # Re: Script achevé
Posté par netsurfeur . Évalué à 2.
Tout à fait d'accord
Là aussi, d'accord.
D'ailleurs le script initial n'avait qu'un seul cd en absolu; les autres étaient relatifs. Il y avait donc moins besoin d'utiliser une variable pour le répertoire de base.
Pas d'accord du tout !
Les emplacements peuvent être différents d'un unix à l'autre mais la variable PATH est là pour résoudre ce problème !
Tu comptes éditer tous tes scripts un par un pour changer les chemins absolus des commandes le jour où tu migreras sur un autre unix ?
[^] # Re: Script achevé
Posté par -=[ silmaril ]=- (site web personnel) . Évalué à 1.
Oui la variable PATH permet de s'affranchir de ce genre d'ennuis
mais pas du probleme des alias. Une solution peut etre de mixer
les deux choses en utilisant:
SED=`which sed`
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.