Résolu le 30-12-18 Commande "touch" ... ou équivalent sur une arborescence

Questions concernant les lignes de commandes
Avatar du membre
arghlub
Administrateur du site
Messages : 10421
Enregistré le : dim. 21 mai 2017 08:19
Localisation : Provence
Contact :

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

Message 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
Tour1 (custom)CM MSI Z270 M3 | CPU Intel I7-7700K | CG Nvidia GTX 1080 | RAM 16Go | tripleBoot : Debian 11 | MXlinux 21 | LMint 19.3 | XFCE
Tour2 (custom)CM Gigabyte | CPU AMD Athlon 5200+ | CG Nvidia GTX 560 | RAM 6Go | FreeBSD 12.1 XFCE
Portable1 MSI GF75 Thin 9SC | CPU Intel I7-9750H | CG Nvidia GTX 1650 | RAM 32Go | dualBoot : LMint 20.2 | MXlinux 21 | XFCE
Portable2 MacBook Air A1466 (2015) | CPU Intel I5-5250U | CG Intel HD Graphics 6000 | RAM 8Go | dualBoot : macOS Sierra | MXlinux 21 XFCE
─────( pour une informatique libre ! -membre en stand-by de l' April.org────────────────

Avatar du membre
tioker
Messages : 980
Enregistré le : sam. 6 mai 2017 00:33
Localisation : Anjou...Feu !
Contact :

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

Message 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.
HP Victus 16: Mint 21.3 Cinnamon 6,0,4 + Windows 11 - Ryzen 5 5600H - NVIDIA GeForce GTX 1650 - Mem 16Go - SSD 512Go
pCloud Synchronisation en temps réel des 4 dossiers personnels

Avatar du membre
arghlub
Administrateur du site
Messages : 10421
Enregistré le : dim. 21 mai 2017 08:19
Localisation : Provence
Contact :

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

Message 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).
;)
Tour1 (custom)CM MSI Z270 M3 | CPU Intel I7-7700K | CG Nvidia GTX 1080 | RAM 16Go | tripleBoot : Debian 11 | MXlinux 21 | LMint 19.3 | XFCE
Tour2 (custom)CM Gigabyte | CPU AMD Athlon 5200+ | CG Nvidia GTX 560 | RAM 6Go | FreeBSD 12.1 XFCE
Portable1 MSI GF75 Thin 9SC | CPU Intel I7-9750H | CG Nvidia GTX 1650 | RAM 32Go | dualBoot : LMint 20.2 | MXlinux 21 | XFCE
Portable2 MacBook Air A1466 (2015) | CPU Intel I5-5250U | CG Intel HD Graphics 6000 | RAM 8Go | dualBoot : macOS Sierra | MXlinux 21 XFCE
─────( pour une informatique libre ! -membre en stand-by de l' April.org────────────────

Avatar du membre
tioker
Messages : 980
Enregistré le : sam. 6 mai 2017 00:33
Localisation : Anjou...Feu !
Contact :

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

Message 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
HP Victus 16: Mint 21.3 Cinnamon 6,0,4 + Windows 11 - Ryzen 5 5600H - NVIDIA GeForce GTX 1650 - Mem 16Go - SSD 512Go
pCloud Synchronisation en temps réel des 4 dossiers personnels

Avatar du membre
débitant
modérateur
Messages : 11534
Enregistré le : mar. 14 juil. 2015 18:22
Localisation : Lorraine France

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

Message 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 ;)

Avatar du membre
arghlub
Administrateur du site
Messages : 10421
Enregistré le : dim. 21 mai 2017 08:19
Localisation : Provence
Contact :

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

Message 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.
;)
Tour1 (custom)CM MSI Z270 M3 | CPU Intel I7-7700K | CG Nvidia GTX 1080 | RAM 16Go | tripleBoot : Debian 11 | MXlinux 21 | LMint 19.3 | XFCE
Tour2 (custom)CM Gigabyte | CPU AMD Athlon 5200+ | CG Nvidia GTX 560 | RAM 6Go | FreeBSD 12.1 XFCE
Portable1 MSI GF75 Thin 9SC | CPU Intel I7-9750H | CG Nvidia GTX 1650 | RAM 32Go | dualBoot : LMint 20.2 | MXlinux 21 | XFCE
Portable2 MacBook Air A1466 (2015) | CPU Intel I5-5250U | CG Intel HD Graphics 6000 | RAM 8Go | dualBoot : macOS Sierra | MXlinux 21 XFCE
─────( pour une informatique libre ! -membre en stand-by de l' April.org────────────────

Avatar du membre
tioker
Messages : 980
Enregistré le : sam. 6 mai 2017 00:33
Localisation : Anjou...Feu !
Contact :

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

Message 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).
HP Victus 16: Mint 21.3 Cinnamon 6,0,4 + Windows 11 - Ryzen 5 5600H - NVIDIA GeForce GTX 1650 - Mem 16Go - SSD 512Go
pCloud Synchronisation en temps réel des 4 dossiers personnels

Avatar du membre
arghlub
Administrateur du site
Messages : 10421
Enregistré le : dim. 21 mai 2017 08:19
Localisation : Provence
Contact :

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

Message 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...
;)
Tour1 (custom)CM MSI Z270 M3 | CPU Intel I7-7700K | CG Nvidia GTX 1080 | RAM 16Go | tripleBoot : Debian 11 | MXlinux 21 | LMint 19.3 | XFCE
Tour2 (custom)CM Gigabyte | CPU AMD Athlon 5200+ | CG Nvidia GTX 560 | RAM 6Go | FreeBSD 12.1 XFCE
Portable1 MSI GF75 Thin 9SC | CPU Intel I7-9750H | CG Nvidia GTX 1650 | RAM 32Go | dualBoot : LMint 20.2 | MXlinux 21 | XFCE
Portable2 MacBook Air A1466 (2015) | CPU Intel I5-5250U | CG Intel HD Graphics 6000 | RAM 8Go | dualBoot : macOS Sierra | MXlinux 21 XFCE
─────( pour une informatique libre ! -membre en stand-by de l' April.org────────────────

Avatar du membre
tioker
Messages : 980
Enregistré le : sam. 6 mai 2017 00:33
Localisation : Anjou...Feu !
Contact :

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

Message 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.
HP Victus 16: Mint 21.3 Cinnamon 6,0,4 + Windows 11 - Ryzen 5 5600H - NVIDIA GeForce GTX 1650 - Mem 16Go - SSD 512Go
pCloud Synchronisation en temps réel des 4 dossiers personnels

Avatar du membre
arghlub
Administrateur du site
Messages : 10421
Enregistré le : dim. 21 mai 2017 08:19
Localisation : Provence
Contact :

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

Message 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)...
Tour1 (custom)CM MSI Z270 M3 | CPU Intel I7-7700K | CG Nvidia GTX 1080 | RAM 16Go | tripleBoot : Debian 11 | MXlinux 21 | LMint 19.3 | XFCE
Tour2 (custom)CM Gigabyte | CPU AMD Athlon 5200+ | CG Nvidia GTX 560 | RAM 6Go | FreeBSD 12.1 XFCE
Portable1 MSI GF75 Thin 9SC | CPU Intel I7-9750H | CG Nvidia GTX 1650 | RAM 32Go | dualBoot : LMint 20.2 | MXlinux 21 | XFCE
Portable2 MacBook Air A1466 (2015) | CPU Intel I5-5250U | CG Intel HD Graphics 6000 | RAM 8Go | dualBoot : macOS Sierra | MXlinux 21 XFCE
─────( pour une informatique libre ! -membre en stand-by de l' April.org────────────────

Avatar du membre
tioker
Messages : 980
Enregistré le : sam. 6 mai 2017 00:33
Localisation : Anjou...Feu !
Contact :

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

Message 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
HP Victus 16: Mint 21.3 Cinnamon 6,0,4 + Windows 11 - Ryzen 5 5600H - NVIDIA GeForce GTX 1650 - Mem 16Go - SSD 512Go
pCloud Synchronisation en temps réel des 4 dossiers personnels

Répondre