On Mon, 2011-04-25 at 21:28 +0200, sneak...@gmx.net wrote:
> Bonjour,
> 
> > Le morceau de code suivant liste et détruit des fichiers:
> > 
> > for file in ${filelist}
> > do
> >   echo "Deleting $file"
> >   rm "$file"
> > done
> > 
> > Mais le problème est qu'il ne traite pas les noms longs correctement. 
> > Comment le modifier pour qu'il fonctionne?
> 
> Cela dépend plutôt des caractères dans le nom (espace, tab, retour à la 
> ligne) que de la longueur du nom. Pour l'exemple en question je ferais plutôt 
> la commande suivante:
> 
> # find /DIRECTORY/ -type f -execdir /bin/echo "deleting {}" \; -execdir 
> /bin/rm {} \;

Oui mais cette version présente encore des problèmes avec le "-" par
exemple.

L'origine du problème dans le script provient du découpage sur les
espaces fait par le "for in". Comment est construite ta "filelist" ?
http://tldp.org/LDP/abs/html/loops1.html

En général, la solution la plus efficace est d'utiliser le caractère
'0x00' comme séparateur, ce qui se fait simplement avec le couple
find/xargs:
   find base -type f -print0 | xargs -0 rm -f

En shell, cela oblige à faire un script à appeler par xargs... Mais j'ai
déjà écrit du awk qui génère des commandes avec les doubles-quote que je
pipe ensuite dans Bash.

Sinon il faut utiliser un langage plus futé comme Perl.

-- 
Yves Martin


_______________________________________________
gull mailing list
gull@forum.linux-gull.ch
http://forum.linux-gull.ch/mailman/listinfo/gull

Répondre à