Page 2 sur 3

Re: Commande "touch" ... ou équivalent sur une arborescence

Posté : dim. 16 juil. 2017 12:31
par arghlub

Dernier message de la page précédente :

Super, ton partage est nickel... 8-)
J'ai donc enregistré ton script et y jetterai un coup d'œil dès que j'aurais un peu de temps (dimanche=famille).

Après un coup d'œil en diagonale sur ton script : je vois que t'as commenté tout ça : c'est super ! (pour toi dans le futur, et pour ceux qui vont scruter ton code)
Bref, je ne tarderai pas à te faire mes retours.
;)

ps : par rapport aux conditions if sur une ligne, tu peux le faire en ponctuant chaque instruction avec un point-virgule. En reprenant la première condition de ton script :

Code : Tout sélectionner

if test -z "$1"; then echo "$lib0 (P1) $libempty"; exit; fi

Re: Commande "touch" ... ou équivalent sur une arborescence

Posté : lun. 17 juil. 2017 10:53
par tioker
Bonjour,
Lundi, on reprend...
arghlub a écrit
ps : par rapport aux conditions if sur une ligne, tu peux le faire en ponctuant chaque instruction avec un point-virgule.
J'ai modifié mon script. Avec cette forme condensée il est plus compact, mais moins clair. C'est une affaire de goût. Le contenu n'a pas changé puisqu'il n'y a pas de bug :mrgreen:
Cdlt.

Re: Commande "touch" ... ou équivalent sur une arborescence

Posté : lun. 17 juil. 2017 12:31
par arghlub
Salut, :)
Désolé je n'ai pu encore me plonger dans ton code (aujourd'hui Lundi, taf qui reprend -même si je bosse chez moi). Promis je le fais dès que j'ai 5minutes (voire une heure ou deux) à moi.
tioker a écrit :Condition if : J'ai modifié mon script. Avec cette forme condensée il est plus compact, mais moins clair. C'est une affaire de goût. Le contenu n'a pas changé puisqu'il n'y a pas de bug :mrgreen:
Forcément c'est moins lisible sans saut à la ligne, ni indentation mais c'est ce que tu voulais me semble-t'il...
D'ailleurs si tu pouvais partager cette version “optimisée” (compactée) cela serait cool 8-)
Dès que je pourrai me poser et zieuter ça, je ne manquerai pas de te faire mes retours et de partager mes optimisations (ou pas si je ne peux améliorer ton code).

ps : Quant aux bouquins que tu aimerais connaître pour approfondir tes connaissances du Bash (j'ai une “petite” bibliothèque consacrée à ça, en version papier), je t'en ferais part en MP (no add on the forum -pas de pub sur le fofo).
;)

Re: Commande "touch" ... ou équivalent sur une arborescence

Posté : lun. 17 juil. 2017 16:41
par tioker
Voici ma version minimaliste... elle l'est tellement que je la mets direct. Elle pourrait tenir en 8 lignes !

Code : Tout sélectionner

#!/bin/bash
#
#-------------------------Changement de date d'un repertoire et des fichiers associes (arborescnce comprise)
#-------------------------$1 = repertoire à  modifier
#-------------------------$2 = date sous forme YYYYMMDDHHMM
#
#------------------------- Constantes 
#
LIBOK="valide"; LIBKO="**non valide**"; LIBEMPTY="vide"; LIB0="repertoire"; LIB1="numerique "; LIB2="date "; LIB3="mois "; LIB4="jour "; LIB5="heure "; LIB6="minute "
#
#--------------------------Test de la variable $1 et $2
#
if test -z "$1"; then echo "$LIB0 (P1) $LIBEMPTY"; exit; fi
if test -z "$2"; then echo "$LIB2 (P2) $LIBEMPTY"; exit; fi
#
#--------------------------Sauvegarde de P1 et P2
#
FOLDER="$1"; DATE="$2"
#
#--------------------------Le repertoire existe ?
#
test -d "$FOLDER" -a ! -L "$FOLDER"
if (( "$?" > 0 )); then echo "$LIB0 $LIBKO"; exit; fi
#
#------------------------- Contrôle de la date
#
#date -d "$DATE" +"%Y%m%d%H%M"
#if (( "$?" > 0 )); then echo "$LIB2 $LIBKO"; exit; else echo "$LIB2 $LIBOK"; fi
TEMP=$(echo "$2" | cut -c 1-8)
date -d "$TEMP" +"%Y%m%d"
if (( "$?" > 0 )); then echo "$LIB2 $LIBKO"; exit; else echo "$LIB2 $LIBOK"; fi
TEMP=$(echo "$2" | cut -c 9-12)
date -d "$TEMP" +"%Y%m%d"
if (( "$?" > 0 )); then echo "$LIB2 $LIBKO"; exit; else echo "$LIB2 $LIBOK"; fi
#
#------------------------- Lancement de la commande touch
#
find "$FOLDER" -exec touch -t "$DATE" {} \;
ls "$FOLDER" -lR
Quelques explications
- je mets les variables en majuscule, ça évite les confusions avec les commandes
- j'utilise la commande "test" pour voir si le répertoire existe
- j'utilise la commande "date" pour contrôler si le format est bon. J'ai découvert cette commande, elle est très puissante !
- l'évaluation du résultat "$?" me permet de traiter les erreurs.

Remarques:
- j'ai cru constater que la commande "date" retournait parfois un code bon alors que le mois était faux. Bon on va pas en faire un fromage. C'est pour cela que j'ai coupé la ligne de test de date en deux en mettant en commentaire celle qui était complète (%Y%m%d%H%M)

Code : Tout sélectionner

$ date -d "201799010101" +"%Y%m%d%H%M"
2017990101010000 [i]là il me dit que c'et bon même si le mois est à 99  :shock:  [/i]
$ date -d "20179901" +"%Y%m%dd"
date: date incorrecte «20179901» [i]là il me dit que c'est incorrect (ouf)[/i]
A vos remarques

Re: Commande "touch" ... ou équivalent sur une arborescence

Posté : lun. 17 juil. 2017 16:49
par débitant
j'ai remplacé balises "quote" par balises "code" ce qui évitera des erreurs pour ceux qui voudraient se servir de ton bash ;)

Re: Commande "touch" ... ou équivalent sur une arborescence

Posté : lun. 17 juil. 2017 17:27
par arghlub
Ah là ça commence à aller vraiment droit au but! 8-)

Ça commence à être KISS (Keep It Simple Stupid) pour un code vraiment performant et facilement maintenable.
tioker a écrit :je mets les variables en majuscule, ça évite les confusions avec les commandes
Attention il existe des conventions de nommage des variables... y'a pas mort d'homme mais les variables en majuscules sont généralement réservées aux “variables d'environnement” : celles qui sont utilisées par ton système (par exemple USER, SHELL, LANG...).
Elles sont en majuscules par convention (pour les afficher triées : commande «env | sort»). Donc dans un script mieux vaut éviter les majuscules qui pourraientt être mal interprétées (du moins par un autre codeur qui te relit).
Par contre, tu peux utiliser le camelCase par exemple (libOk, libKo dans ton exemple) ou l'underscore (lib_ok, lib_ko_. Attention ce sujet est polémique c'est une vieille querelle de codeur, perso j'aime bien le camelCase.
;)

Re: Commande "touch" ... ou équivalent sur une arborescence

Posté : lun. 17 juil. 2017 17:55
par tioker
Je découvre un concept, le camelCase.
Comme monsieur Jourdain, je le pratique pour le nommage de mes fichiers, mais en fonction Upper (1ère lettre en majuscule aussi).
D'ailleurs dans mon script n'y aurait-il pas confusion entre date (variable) et date (commande) ?
Et aussi une expression --> KISS.

J'apporterai les corrections une fois le script définitivement adopté.

Cheers (et non pas KISS).

Re: Commande "touch" ... ou équivalent sur une arborescence

Posté : lun. 17 juil. 2017 19:13
par arghlub
Pour la date le top serait de faire une condition utilisant des “expressions régulières”...

⚠ Attention le concept des RegEx (expressions régulières), c'est pas simple à aborder, c'est un vaste sujet (des bouquins entiers y sont consacrés) mais je pense que cela serait un meilleur moyen que de passer par la fonction date (une expression régulière bien tournée c'est impitoyable).

Voici une première expression régulière pour la date version YYYYMMDDHHmm (à améliorer surtout sur la partie "heure" qui tourne sur 24H et ça ne prend pas en compte les années bissextiles!) :

Code : Tout sélectionner

dateRegEx="^[0-9]{4}(0[0-9]|1[0-2])([0-2][09]|3[0-1])[0-2][0-9][0-5][0-9]"
Donc après avoir défini cette variable il faudrait faire un test “if” de comparaison avec ton paramètre de “date” ($2)...

Je vais m'y pencher sérieusement ce soir...
;)

Re: Commande "touch" ... ou équivalent sur une arborescence

Posté : lun. 17 juil. 2017 19:58
par tioker
J'avais vu le concept regEx mais la commande date m'a semblé plus appropriée.... et surtout plus simple.
Attention tout de même. Le mieux est l'ennemi du bien. Donc on peut améliorer pour se faire plaisir mais si ça fonctionne c'est déjà bien.

Re: Commande "touch" ... ou équivalent sur une arborescence

Posté : lun. 17 juil. 2017 20:11
par arghlub
tioker a écrit :Le mieux est l'ennemi du bien.
Bien sûr, c'est le principe même du concept KISS, cependant si la commande “date” est foireuse dans certains cas... “le bien est l'ami du mieux”
;)

ps : cependant, t'as vraiment besoin de mettre les heures-minutes??? tu pourrais te contenter de Année-Mois-Jour à moins que tu ais un classement de CD-MP3 hallucinant où chaque compositeur faisait ça à la minute près (j'en doute si tu écoutes du classique comme j'ai cru comprendre)...

Re: Commande "touch" ... ou équivalent sur une arborescence

Posté : lun. 17 juil. 2017 20:49
par tioker
Pour la beauté ... de l'écriture (ou de la plume).
1- effectivement la commande "date" a l'air d'avoir un comportement pas toujours fiable
2- la commande touch avec son option -t nécessite les heures et minutes (dixit touch --help). Mais bon, on peut compléter effectivement.
3- regEx ... allez, je me lance, ou plutôt je plonge. Une bonne musique sur les oreilles, une paire de lunettes bien nettoyées, on va trouver.

A plus