|
|
|
|
Salut a tous,
J'ai besoin de renommer des fichiers en ajoutant la date a leur nom.
ex : renommer monfichier en monfichier-2008-03-05
J'ai besoin de faire ca sur tous les fichier d'un repertoire et de ses sous repertoires.
J'ai donc ecrit le script suivant :
find * -type f -exec mv "{}" "{}-2008-05-03" \;
Salut jipicy,
autre fichier.doc fichier v1.2.xls monfichier myfile. Executons la commande suivante : find -type f -exec bash -c 'path=$(dirname "$1"); nameext=$(basename "$1"); name=${nameext%.*}; [ "$name" = "$nameext" ] || ext=.${nameext##*.}; mv "$1" "$path/$name-2008-03-06$ext";' - {} \;
Qu'est ce qu'on obtient ? autre fichier-2008-03-06.doc fichier v1.2-2008-03-06.xls monfichier-2008-03-06 myfile-2008-03-06. Et la ca marche ! Jipicy je ne te dois pas seulement une ligne de script. Je te dois de m'avoir fait toucher du doigt un langage etonement perfectionne. Rien que de comprendre comment faire un if then fi m'a pris 1/2 heure et encore une autre 1/2 heure pour trouver comment l'ecrire en une seule ligne. Voila... C'est fini... ET NON ! HAHAHA (rire demoniaque) ! Ca n'est pas termine. Bien que tres interessant dans la proposition de Jipicy, la date a ajouter n'est pas la date du jour. Elle doit etre recuperee dans le nom du repertoire contenant les fichiers ! Le nouveau probleme est le suivant : Partant des fichiers suivants : /home/santiago/repertoire-20071215/fichier1.txt /home/santiago/repertoire-20071215/fichier2.txt /home/santiago/repertoire-20071215/sousrep/fichier3.txt /home/santiago/repertoire-20071215/sousrep/fichier4.txt /home/santiago/repertoire-20071230/fichier1.txt /home/santiago/repertoire-20071230/fichier2.txt /home/santiago/repertoire-20071230/sousrep/fichier3.txt /home/santiago/repertoire-20071230/sousrep/fichier4.txt Je voudrais arriver a l'arborescence suivante : /home/santiago/repertoire/fichier1-20071215.txt /home/santiago/repertoire/fichier1-20071230.txt /home/santiago/repertoire/fichier2-20071215.txt /home/santiago/repertoire/fichier2-20071230.txt /home/santiago/repertoire/sousrep/fichier3-20071215.txt /home/santiago/repertoire/sousrep/fichier3-20071230.txt /home/santiago/repertoire/sousrep/fichier4-20071215.txt /home/santiago/repertoire/sousrep/fichier4-20071230.txt Bon ben il est 02:12. Mes paupieres tombent et la nuit porte conseil. Alors on verra demain. Bonne nuit a tous Santiago Il y a 10 types de personnes dans le monde Ceux qui comprennent le binaire et les autres.
|
Re-
-c chaîne Si l'argument -c est présent, les commandes sont interprétées
depuis la chaîne fournie. S'il existe d'autres arguments
après la chaîne, ils sont transmis comme paramètres position-
nels, en commençant par $0.;-))
Faut il toujours mettre <script> entre '' ? Oui. Si tu dois utiliser d'autres simple quote dans l'expression, il faudra les protéger ' \'...\' '. Comment ferait on avec plusieurs parametres ? Avec "find" il ne peut y en avoir qu'un, vu que le paramètre est la représentation de "{}". Et s'il y a des espaces dans les parametres ? Toujours avec "find", je pense que ça n'a pas d'importance et que l'interprétation de "{}" est transmise sous la forme " '{}' ", donc quoté ce qui doit éliminer le problème des espaces. Faudrait il ecrire bash -c '<script>' - '<param>' '<param>' Oui je pense. Ou avec des doubles quotes... 3/ Voyons maintenant le contenu de <script> T'as tout bon pour tout ;-)) 3.bis/ Je corrigerais avec l'instruction suivante : ${<varname>##<modele>} Supprime la plus grande partie a gauche de <varname> qui ressemble a <modele>. Ma solution était donnée en fonction de ton énoncé et de ce fait je ne pouvais anticiper cet éventualité, mais je vois que tu as bien rebondi et trouver la parade, chapeau bas ;-) 3.ter/ Je propose la correction suivante : [ "$prefix" = "$name" ] || ext=${name##*.}; On ne cherche l'extension que si le prefix est different du nom complet. Pas mieux ;-) la date a ajouter n'est pas la date du jour. Je ne pouvais pas savoir ;-)) Pour le reste je m'y penche dessus... ;-)) Z'@+...che. JP : Zen, my Nuggets ! ;-) Le savoir n'est bon que s'il est partagé. |
Salut jipicy,
sed: invalid option -- E
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...
En effet, dans le descriptif, je ne trouve pas l'option -E. J'ai essaye avec l'option -e et j'obtiens ca : sed: -e expression #1, char 1: unknown command: `-' En relisant plus attentivement ton post, tu dis : "-E interperte le motif [...] comme une expression régulière étendue..." Et j'ai trouve, il s'agit de l'option -r chez moi. Ensuite, j'ai essaye de comprendre les expressions regulieres. Merci wikipedia ! 1) La partie avant la date ? Pourquoi (/.+/[^/]+)et pas (/.+)? En effet, pourquoi imposer au moins 2 slash avant de chercher la date. De plus, afin de le generaliser, j'ai reecris ton script avec comme parametre le repertoire contenant les dossiers datés et quand je lance la commande $ trierpardate /home/santiago/ je voudrais qu'il isole le parametre $1 dans l'expression reguliere. Par exemple : /home/santiago/dossier-20080316/... < $1 >< \2 >< \3 > < \1 > J'ai essaye sed -r -n '#($1(.+)(-[0-9]{8})...
Mais ca ne marche pas. As tu une idee ? Je me doute qu'il faut echaper quelques caracteres, mais je ne vois pas comment. 2) L'extension ? Je voudrais prendre en compte les cas ou il n'y a pas d'extension. Le probleme, c'est que si j'ecrit sed -e -n 's#((/.+/[^/]+)(_[0-9]{14})/(.+/)*([^/]+)(\.[a-zA-Z0-9]+)?)#..., alors il passe tout (nom de fichier + extension eventuelle) dans \5. Je vais essaye de faire un mix avec l'algo de jipicy.
Voila, je rebosse encore ce we sur le pb et je vous tiens au courant. A+ Santiago Il y a 10 types de personnes dans le monde Ceux qui comprennent le binaire et les autres. |
Salut à tous,
lami20j@debian:~$ find /home/lami20j/doc -type f
/home/lami20j/doc/c/fic3.xls
/home/lami20j/doc/fichier
/home/lami20j/doc/b/fic2.xls
/home/lami20j/doc/a/fic.xls
/home/lami20j/doc/a.out
/home/lami20j/doc/moyenne.c
lami20j@debian:~$ for i in $(find /home/lami20j/doc -type f);do mv -v $i "${i%%.*}-$(date +%Y-%m-%d)$(echo ${i##*..}|sed 's/.*\(\..*\)/\1/'|sed 's/^\/.*//')";done
`/home/lami20j/doc/c/fic3.xls' -> `/home/lami20j/doc/c/fic3-2008-03-16.xls'
`/home/lami20j/doc/fichier' -> `/home/lami20j/doc/fichier-2008-03-16'
`/home/lami20j/doc/b/fic2.xls' -> `/home/lami20j/doc/b/fic2-2008-03-16.xls'
`/home/lami20j/doc/a/fic.xls' -> `/home/lami20j/doc/a/fic-2008-03-16.xls'
`/home/lami20j/doc/a.out' -> `/home/lami20j/doc/a-2008-03-16.out'
`/home/lami20j/doc/moyenne.c' -> `/home/lami20j/doc/moyenne-2008-03-16.c'
lami20j@debian:~$ find /home/lami20j/doc -type f
/home/lami20j/doc/moyenne-2008-03-16.c
/home/lami20j/doc/c/fic3-2008-03-16.xls
/home/lami20j/doc/a-2008-03-16.out
/home/lami20j/doc/b/fic2-2008-03-16.xls
/home/lami20j/doc/a/fic-2008-03-16.xls
/home/lami20j/doc/fichier-2008-03-16
lami20j@debian:~$--
lami20j |
Merci lami20j mais comme explique precedement, mon probleme maintenant est d'arrive a recuperer la date dans le nom du repertoire (il ne s'agit pas de la date d'aujourd'hui).
|
Salut a tous, c'est encore moi !
$ trierpardate SOURCE DESTINATION #!/bin/bash for file in $(find $1 -type f); do echo $file | sed -r -n 's#regexp#script#p' | bash done Et j'aimerais utiliser $1 (SOURCE) dans regexp et $2 (DESTINATION) dans script. Est-ce possible ? Merci a tous Santiago Il y a 10 types de personnes dans le monde Ceux qui comprennent le binaire et les autres. |
Pour ce qui concerne "sed" et les variables, voir : SED - The Stream EDitor - Part II - Le remplacement de variables
|