Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 18/11/2013, à 16:48

percherie

Utiliser une chaine de caractère pour la commande touch

Bonjour,


J'ai un lot d'image dont le nom contient la bonne date mais l'horodatage du fichier est erroné. Je souhaite donc utiliser les nom de fichier pour modifier l'horodatage en lot. Les nom de fichier sont sous la forme IMG_YMD_HMS par exemple IMG_20121017_143532

J'ai déjà trouvé comment définir une date à des fichier récursivement :

find . -name "*.jpg" -exec touch -t 200701310846.26 {} \;

Actuellement je fait des essais pour comprendre comment traiter une chaîne de caractère extraite du nom du fichier avec expr ou sed (ou autre chose)

Par contre je n'ai aucune idée comment associer les deux solutions pour définir la date des fichiers avec la chaîne de caractère. Quel documentation doit je consulter ??


Nomade en camion utilisant Ubuntu. Si vous souhaitez suivre mes voyages : http://toutenkamion.net/

Hors ligne

#2 Le 18/11/2013, à 17:14

percherie

Re : Utiliser une chaine de caractère pour la commande touch

J'ai trouvé comment avoir le bon format de date à partir du fichier avec la commande :

find . -name "*.jpg" -exec touch -t `find | sed s/......// | sed s/_// | sed s/.jpg//` {} \;

Par contre j'ai tester différente méthode pour le placer dans la commande précédente j'ai toujours une erreur indiquant un format de date non valide. Voici les quelques essais que j'ai fait :
find . -name "*.jpg" -exec touch -t `find . -name "*.jpg" -exec touch -t `find | sed s/......// | sed s/_// | sed s/.jpg//` {} \;` {} \;
find . -name "*.jpg" -exec touch -t $(find . -name "*.jpg" -exec touch -t `find | sed s/......// | sed s/_// | sed s/.jpg//` {} \;) {} \;
find . -name "*.jpg" -exec touch -t "find . -name "*.jpg" -exec touch -t `find | sed s/......// | sed s/_// | sed s/.jpg//` {} \;" {} \;

Là je sèche


Nomade en camion utilisant Ubuntu. Si vous souhaitez suivre mes voyages : http://toutenkamion.net/

Hors ligne

#3 Le 18/11/2013, à 17:41

Postmortem

Re : Utiliser une chaine de caractère pour la commande touch

Salut,

find . -name '*.jpg' -exec bash -c 'ma_date=$(sed -r "s/.*IMG_([0-9]{8})_([0-9]{4})([0-9]{2})\.jpg/\1\2.\3/" <<< "$0"); touch -t $ma_date "$0"' {} \;

Edit :
En fait, y'a pas besoin de variable :

find . -name '*.jpg' -exec bash -c 'touch -t $(sed -r "s/.*IMG_([0-9]{8})_([0-9]{4})([0-9]{2})\.jpg/\1\2.\3/" <<< "$0") "$0"' {} \;

Dernière modification par Postmortem (Le 19/11/2013, à 03:09)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#4 Le 18/11/2013, à 17:44

ar barzh paour

Re : Utiliser une chaine de caractère pour la commande touch

dans le répertoire où je suis positionné j'ai créé un fichier bash tout simple pour l'exemple et nommé essai qui contient ceci :

#!/bin/bash
ls -ails $1

sa fonction : effectuer un listage (ls) assez complet (-ails) d'un fichier qui arrive en paramètre de la commande (le $1)
je lui ai donné les droits d'exécution
ensuite dans un terminal je passe la commande suivante :

find . -iname "*.txt" -exec ./essai {} \;

le résultat est le suivant :
find me cherche tous les fichiers .txt puis sur chacun de ces fichiers m'exécute un listage du fichier
ce qui me donne ceci

xxx@xxx-desktop:~$ find . -iname "*.txt" -exec ./essai {} \;
1449371 4 -rw------- 1 xxx xxx 605 févr. 23  2013 ./.pki/nssdb/pkcs11.txt
1583691 4 -rw------- 1 xxx xxx 355 nov.  18 15:40 ./.mozilla/firefox/2qeg6npa.default/cert_override.txt
1583711 4 -rw-rw-r-- 1 xxx xxx 154 nov.  18 16:06 ./.mozilla/firefox/2qeg6npa.default/urlclassifierkey3.txt
1078278 4 -rw-rw-r-- 1 xxx xxx 679 nov.  18 14:06 ./resJS2.txt
1713368 4 -rw-rw-r-- 1 xxx xxx 212 nov.  15 20:34 ./.config/libreoffice/3/user/uno_packages/cache/log.txt
1050568 4 -rw-rw-r-- 1 xxx xxx 84 nov.  18 14:10 ./tmp1.txt
1078277 4 -rw-rw-r-- 1 xxx xxx 1863 nov.  18 14:04 ./resJS.txt
1574875 8 -rw-rw-r-- 1 xxx xxx 7069 nov.  18 14:10 ./Bureau/confxxx.txt

en adaptant le fichier essai à ce que tu veux faire peut-être que ce sera bon


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#5 Le 18/11/2013, à 17:46

ar barzh paour

Re : Utiliser une chaine de caractère pour la commande touch

waouh je viens de voir qu'un spécialiste de "sed" est passé avant moi
bon courage


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#6 Le 19/11/2013, à 14:12

percherie

Re : Utiliser une chaine de caractère pour la commande touch

Postmortem a écrit :

Salut,

find . -name '*.jpg' -exec bash -c 'ma_date=$(sed -r "s/.*IMG_([0-9]{8})_([0-9]{4})([0-9]{2})\.jpg/\1\2.\3/" <<< "$0"); touch -t $ma_date "$0"' {} \;

Edit :
En fait, y'a pas besoin de variable :

find . -name '*.jpg' -exec bash -c 'touch -t $(sed -r "s/.*IMG_([0-9]{8})_([0-9]{4})([0-9]{2})\.jpg/\1\2.\3/" <<< "$0") "$0"' {} \;

Un grand merci, je cherchais quelle variable permettait de réutiliser la dernière sortie (ici c'est $0). Pareil pour le slash devant IMG, je n'arrivais pas à le substituer, l'utilisation d'une étoile permet d'y arriver.

Je ne connaissait pas l'utilisation des "références arrière", c'est intéressant comme tout.

Voici ce que j'ai compris, je l'écris pour qu'on puisse corriger mon raisonnement en cas d'erreur :
1 - on recherche les fichiers *.jpg avec

find . -name '*.jpg'

2 - on exécute un code en bash utilisant les chaîne de caractère permettant l'utilisation de la variable $0 avec

-exec bash -c

3 - on modifie la date du fichier trouvé par find

touch -t $VALEUR_DATE "$0"

4 - on peut utiliser sed directement comme variable sur le fichier trouvé par find (utilisation de $0)

$(sed -r "s/MODÈLE/REMPLACEMENT/" <<< "$0")

5 - on découpe le modèle en références arrière (exemple sur ./IMG_20130912_131646.jpg)

.*IMG_([0-9]{8})_([0-9]{4})([0-9]{2})\.jpg

6 - pour les réutiliser en remplacement pour obtenir 201309121316.46

\1\2.\3

Nomade en camion utilisant Ubuntu. Si vous souhaitez suivre mes voyages : http://toutenkamion.net/

Hors ligne

#7 Le 19/11/2013, à 14:40

Postmortem

Re : Utiliser une chaine de caractère pour la commande touch

T'as tout pigé ! Enfin presque !

percherie a écrit :

Pareil pour le slash devant IMG, je n'arrivais pas à le substituer, l'utilisation d'une étoile permet d'y arriver.

Ce n'est pas l'étoile qui fait que je substitue le slash. C'est grâce à .* (point-étoile).
Le point signifie n'importe quel caractère et l'étoile signifie 0, 1, ou plusieurs fois le caractère précédent (dans notre cas, n'importe quel caractère donc).
Donc, .*IMG_, ça correspond à tout jusqu'à IMG_ inclus.
Pour matcher le slash spécifiquement, on aurait pu faire :

sed -r "s/.*\/IMG_([0-9]{8})_([0-9]{4})([0-9]{2})\.jpg/\1\2.\3/" <<< "$0"

Ou :

sed -r "s#.*/IMG_([0-9]{8})_([0-9]{4})([0-9]{2})\.jpg#\1\2.\3#" <<< "$0"

Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#8 Le 19/11/2013, à 15:32

percherie

Re : Utiliser une chaine de caractère pour la commande touch

Je comprend mieux pourquoi ça marche dans tous les sous dossier. Le point étoile prend en compte tous les différents chemin existant.

Maintenant je continu mes recherches pour définir la date en EXIF dans des photos qui en contiennent et d'autre pas, ça va être plus facile maintenant. Dès que je trouve comment faire je poste le résulta ici


Nomade en camion utilisant Ubuntu. Si vous souhaitez suivre mes voyages : http://toutenkamion.net/

Hors ligne

#9 Le 19/11/2013, à 16:59

percherie

Re : Utiliser une chaine de caractère pour la commande touch

J'ai fait quelques essais avec jhead, exiftool et exiv2 et seul exiv2 arrive à définir une date quand aucune donnée EXIF existe. Ce qui donne depuis un fichier nommé IMG_20121017_143532 qui doit finir en 2012:10:17 14:35:32

find . -name '*.jpg' -exec bash -c 'exiv2 -M "set Exif.Image.DateTime $(sed -r "s/.*IMG_([0-9]{4})([0-9]{2})([0-9]{2})_([0-9]{2})([0-9]{2})([0-9]{2})\.jpg/\1:\2:\3 \4:\5:\6/" <<< "$0")" "$0"' {} \;

Nomade en camion utilisant Ubuntu. Si vous souhaitez suivre mes voyages : http://toutenkamion.net/

Hors ligne