Afficher un message
Vieux 06/02/2007, 09h03   #6
Hugues
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: script de nettoyage d'une arborescence


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/
  Réponse avec citation
 
Page generated in 0,05973 seconds with 9 queries