B'jour,
Ce cher Jacques L'helgoualc'h <lhh+no_spam@free.fr> a dit :
> Le 05-02-2007, Stephane Dupille a écrit:
>> Christophe Raverdy <adresse@fai.tld.invalid> écrit :
>
>>> tar czvf faq.tgz faq/
>>> REP=`ls -1R faq`
>
> Comme tar peut prendre un certain temps, le ls peut être un peu
> différent ; sa sortie est polluée par des lignes vides, suivie des noms
> de sous-répertoires suivis de «:». On pourrait la purger avec un
En plus, utiliser ls pour obtenir une liste de fichiers, c'est MAL. ls sert a
formater une liste de fichiers de facon "human-friendly", mais absolument pas
de facon "machine-friendly".
Il y a plein d'autres methodes beaucoup plus sures, en passant par les
wildcards du shell ou par find.
>>> for FICHIER in $REP
>>
>> for i in $REP/**/ ;
>> me parait être un poil mieux que de forker le ls, si le shell le
>> permet.
toutafait.
>> Sinon, un find :
>>
>> find $REP -type f -exec sed... ';'
>
> Tar fournit déjà la liste des fichiers à traiter, donc
>
> for FICHIER in $(tar cvzf temp.tgz .tmp|grep -vE '\.old$|/$')
> do
> sed -i -e '/^X-No-Productlink:/d' "$FICHIER"
> done
Je propose aussi cela :
tar cvzf faq.tgz faq | grep -vE '\.old$|/$' | xargs -l1 sed -i -e '/^X-No-Productlink:/d'
Sauf qu'il faut gicler les noms de dossiers dans le resultat de tar, et ce
n'est pas forcement evident, donc ca demande un peu de boulot en plus.
Toujours garder un truc a l'esprit avec unix : FAIRE SIMPLE ET FACILE.
Mais par contre, big problem, ca ne va pas rediriger le resultat dans un fichier
mais dans le terminal. Et la ca devient un peu plus complique, du coup.
> Pourrait suffire, du moins s'il n'y a pas de saut de ligne dans les noms
> de fichiers, et autres fourberies. Sinon,
>
> find ... -print0 | xargs -0 sed -i -e 'commande' <pas de fichier>
Ou encore
find ... -exec sed -i -e "s/truc/blabla/" '{}' ';'
et pour ignorer les *.old :
find ./faq -type f -name "*.old" -prune -o -type f -exec sed ..... '{}' ';'
Mais comme il y a la redirection a faire, je ferais plutot ceci :
for i in $(find ./faq -type f -name "*.old" -prune -o -type f)
do
sed blablablablabla $i > $i.new
done
puis apres verification du resultat :
for i in **/*.new
do
mv $i ${i/.new$/}
done
et basta
La, c'est tout de suite mieux, non ?
--
Hugues - Debianiste avant tout -
http://www.hiegel.fr/~hugues/Linux/