URL: https://linuxfr.org/forums/programmation-shell/posts/est-ce-un-fichier-un-r%C3%A9pertoire-et-histoire-de-pipelines Title: Est-ce un fichier ? Un répertoire ? Et histoire de pipelines. Authors: RobertRyan Date: 2005年09月05日T18:01:45+02:00 Tags: Score: 0 Bonjour à tous. Je suis en train d'écrire un programme en shell bash permettant le déplacement automatique de fichiers. Le programme se trouvant ci-dessous fonctionne. De quoi s'agit-il? Les employés d'une entreprise d'audit créés, chaque fois qu'une entreprise est auditée, un fichier contenant leur rapport sous /home/[le rep de l'auditeur] (es : Jacques dépose ses rapports dans /home/Jacques). Le rapport est de la forme [nom de l'entreprise].extension (ex : Renault.doc). Le programme déplace les rapports des auditeurs et les place sous /Rapports/[nom de l'entreprise] (ex : le rapport renault.doc de Jacques sera placé sous /Rapports/Renault). Eventuellement, si l'entreprise est auditée pour la première fois (et qu'il n'y a donc pas encore de répertoire à son nom sous /Rapports), le programme créé un répertoire au nom de l'entreprise. Le premier rapport déposé prendra alors le nom, par exemple, Sony.001.doc. Si l'entreprise a été auditée plusieurs fois, le programme renomme le rapports en le déplaçant. Ainsi, le 2nd rapport sur Renault s'appellera Renault.002.doc, le 3ième, Renault.003.doc, etc... N'hésitez pas à me demandez des précisions si je n'ai pas été assez clair. 1) Si le programme rencontre un fichier dans le répertoire réservé aux auditeurs /home, il se plante. Même chose si c'est un répertoire dans le répertoire d'un auditeur, où il ne devrait y avoir que des fichiers. Comment s'écrivent les tests "si tel objet est un répertoire" et "si tel objet est un fichier" ? 2) A partir de la ligne "d=$(ls -1 | tail -1)" jusqu'à la ligne "d=$(echo $d | sed 's/^0*//')", j'ai écris une série de commande que je voudrais en une seule ligne, en faisant un truc du genre : d=$(ls -1 | tail -1 | ${d%*.*} | ${d##*.} | sed 's/^0*//') mais qui fonctionne, bien sûr! Y a t'il un moyen de faire ça? #! /bin/bash # Le programme suivant prend en compte un nombre illimité d'auditeurs et jusqu'à 999 rapports. # Les rapports sont traités quelque soit leur extension. # Le nom des rapports peut contenir n'importe quel signe y compris les espaces. # Le nom des rapports classés est de la forme 'société.001.ext'. # Le fait d'ajouter un point entre le nom de la société et le numéro permet de prendre # en compte la présence éventuelle de chiffres dans le nom de la société. # 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 cd /home for a in * ; do £spaces£ £/spaces£ £spaces£ £/spaces£if [ "$a" = \* ] ; then £spaces£ £/spaces£break £spaces£ £/spaces£fi cd "/home/$a" for b in * ; do £spaces£ £/spaces£ £spaces£ £/spaces£if [ "$b" = \* ] ; then £spaces£ £/spaces£continue £spaces£ £/spaces£fi # on extrait du nom du rapport le nom de la société # c'est à dire tout ce qui est avant le dernier point c=${b%*.*} # on récupère l'extension du rapport à classer # c'est à dire tout ce qui est après le dernier point e=.${b##*.} cd /Rapports # un répertoire au nom de la société existe-t-il déjà? £spaces£ £/spaces£if [ -d "$c" ] ; then £spaces£ £/spaces£cd "$c" £spaces£ £/spaces£# on extrait de la liste le dernier fichier ajouté £spaces£ £/spaces£# (celui dont le nombre est le plus grand) £spaces£ £/spaces£d=$(ls -1 | tail -1) £spaces£ £/spaces£# on retire au fichier son extension £spaces£ £/spaces£d=${d%*.*} £spaces£ £/spaces£# on extrait son numéro £spaces£ £/spaces£d=${d##*.} £spaces£ £/spaces£# on supprime les zéros non significatifs £spaces£ £/spaces£d=$(echo $d | sed 's/^0*//') £spaces£ £/spaces£# on incrémente ce numéro de 1 £spaces£ £/spaces£d=$(($d + 1)) £spaces£ £/spaces£# on lui accolle 2 '0' £spaces£ £/spaces£d=00$d £spaces£ £/spaces£# on extrait les 3 premiers chiffres (à partir de la droite) £spaces£ £/spaces£# \([0-9][0-9][0-9]\) et 1円 : motif conservant les 3 chiffres de droite £spaces£ £/spaces£d=$(echo $d | sed 's/^0*\([0-9][0-9][0-9]\)/1円/g') £spaces£ £/spaces£# on déplace enfin le rapport du répertoire de l'auditeur £spaces£ £/spaces£# dans le répertoire de la société en le renommant £spaces£ £/spaces£mv "/home/$a/$b" "/Rapports/$c/$c"."$d$e" £spaces£ £/spaces£ £spaces£ £/spaces£else £spaces£ £/spaces£# on crée un répertoire au nom de la société £spaces£ £/spaces£mkdir "/Rapports/$c" £spaces£ £/spaces£# on y déplace alors le rapport en lui attribuant le numéro '001' £spaces£ £/spaces£mv "/home/$a/$b" "/Rapports/$c/$c".001"$e" £spaces£ £/spaces£ £spaces£ £/spaces£fi done done Merci bien pour votre attention!

AltStyle によって変換されたページ (->オリジナル) /