[gull] Question bash noms longs

Yves Martin ymartin59 at free.fr
Mon May 2 00:03:43 CEST 2011


On Mon, 2011-04-25 at 21:28 +0200, sneaky56 at 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




More information about the gull mailing list