Bonjour,

Le 15 Jul, Francois Cerbelle a écrit:
> Le Mon, Jul 15, 2002 at 01:28:59PM +0200, xerxas ecrit :
>> On Mon, Jul 15, 2002 at 01:11:29PM +0200, Philippe wrote:
>> > Bonjour,
>> > voici ma question :
>> > j'ai une ip a changer ds plusieurs centaines de fichiers dans des
>> > sous repertoires & repertoires.. quelqu'un a une idée d'un petit
>> > script ou d'une petite commande, qui pourrait remplacer une chaine
>> > par une autre ? du genre
>> > : remplace fichier toto titi ? histoire que je puisses le lancer
>> > avec un find ....
>> > Merci d'avance ..
>> > Philippe
>> for i in * ; do cat $i | sed 's/127\.0\.0\.1/10.0.0.2/' >> $i.2 ;
>> done ; et ensuite mmv ( multimove, ou for i in * ; do mv $i `basename
>> $i` ; done  ).
>> Voila, je pense que c'est une solution viable.
> Tu oublies les sous-repertoires, et par précaution, j'ajouterais
> l'extension à supprimer dans les parametres du basename :
> for i in `find . -type f` ; do cat $i | sed 's/127\.0\.0\.1/10.0.0.2/'
> > $i.2 ; done ; for i in `find . -type f -name *.2` ; do mv $i
> `basename $i .2` ;
> 
> Sur les traitements par lots de ce genre, je préfère mettre quelques
> sécurités ! :-)
> 
C'est un concours ? j'en ai une version aussi ;-) En et plus faut pas
oublier le flag g de sed, des fois ça sert... Pour ma défense je
voudrais dire que ce qui suit n'est pas inutilement compliqué. Avec un
fifo on peut faire ce genre de truc sur des milliards de fichiers, pas
avec ``. Avec cat >fichier_original, on est certain de conserver l'inode
et donc tous les droits du fichier original, pas avec mv. Faut toujours
prévoir un parachute, ça cree donc des fichiers .sauvegarde-nomoriginal.
Le resultat des modifs est dans /tmp/resultat. faut pas mettre le script
dans le répertoire courant.

        Christophe

-- 
char*p="[)1++++++11+(QI1)9191991)9)1)(II1)919Y91)9)1)(AK+9;991+3*(9I1*IY991)Q1\
)(1I1))A91991)Q1)(+)1)1++9;)Q1+(";main(_){while(*p){for(_=*p-32>>3;_;--_)
putchar(' ');if(!(_=*p++-32&7))putchar('\n');else while(_--)printf("_/");}}
#! /bin/sh

exec 3>/tmp/resultat
trap "rm -f /tmp/monfifo.$$ /tmp/toto.$$" 0

rm -f /tmp/toto.$$ || exit 1
mkfifo /tmp/monfifo.$$ || exit 1
find . ! -name '.sauvegarde-*' -type f >/tmp/monfifo.$$ &
oifs="$IFS"
IFS='
'
# sleep nécessaire
sleep 2
while read i
do
        IFS="$oifs"
        echo -n "$i" >&3
        sed -e 's/127\.0\.0\.1/10.0.0.2/g' <"$i" >/tmp/toto.$$
        if ! cmp /tmp/toto.$$ "$i" >/dev/null 2>&1
        then
                echo '  modif' >&3
                cp "$i" "${i%/*}/.sauvegarde-${i##*/}"
                cat /tmp/toto.$$ >"$i"
        else
                echo '  non_modif' >&3
        fi
done </tmp/monfifo.$$
IFS="$oifs"

Répondre à