Je m’arrache les cheveux à trouver une commande élégante pour rechercher avec find des vieux fichiers doc et xls ayant une date de modification erronée (31/12/1997) et remplacer celle-ci par la date conservée dans les propriétés lues par file.
J’arrive pour l’instant à trouver les fichiers, afficher leur date de modification erronée et à afficher leurs propriétés : find . \( -name *.doc -o -name *.xls \) -newermt 1997-12-30 ! -newermt 1998-01-01 -printf %p\|%T+\| -exec file -b {} \;
Ça me renvoie par exemple : ./chemin/vers/fichier.doc|1997-12-31+21:19:56.0000000000|Composite Document File V2 Document, Little Endian, Os: Windows, Version 4.10, Code page: 1252, Title: xxx , Author: xxx, Template: Normal.dot, Last Saved By: xxx, Revision Number: 4, Name of Creating Application: Microsoft Word 8.0, Total Editing Time: 05:00, Create Time/Date: Wed Feb 6 13:33:00 2002, Last Saved Time/Date: Wed Feb 6 15:06:00 2002, Number of Pages: 1, Number of Words: 1366, Number of Characters: 7788, Security: 0
Dans un premier temps j’aimerais juste filtrer la sortie de file avec seulement la valeur de Last Saved Time/Date mais je n’arrive pas à faire suivre file d’un tube avec par exemple sed ou awk.
find ... -exec sh -c 'file "$1" | awk ...' sh {} \;
mais, l’imbrication des quotes simples et doubles, va rendre l’écriture et l’exécution difficiles.
il serait peut-être plus simple de faire un petit script qui serait appeler avec l’-exec
Pour ma culture perso, $1 remplace {} lorsqu’on exécutesh -c dans -exec ?
C’est le sh {} à la fin qui a été décisif dans la réussite, je ne comprend pas trop son rôle.
Quant à la dernière proposition de MicP, pourrais-tu m’expliquer ${BASH_REMATCH[1]}. Sinon la commande ne fonctionne pas, car elle ne renvoie la date que du 1er fichier trouvé puis toutes les propriétés lues par file concaténées à la suite.
Pas trop en forme, j’avais pris le retour texte que tu avais transmis dans ton premier message,
et je me suis arrangé pour en extraire la date/heure.
(D’un autre côté, je n’ai pas de fichiers .doc ni .xls pour faire des tests)
Du coup, j’avais complètement oublié qu’il y en aurait une liste entière…
Pour le BASH_REMATCH c’est ce qui est entre parenthèses dans la Regex qui est gardé <=> Entre les deux motifs.
Entre :
man bash
et tape un caractère / suivit de 5 espaces et de BASH_REMATCH puis tape sur la touche entrée :
/ BASH_REMATCH
En suivant le conseil de watael tu pourrais créer un script monScript.sh contenant :