[comp.unix.questions] Special characters in find inside shell script

tombre@crin.crin.fr (Karl Tombre) (12/16/87)

At logout time we often want to clear our directories. At the moment we have
a script doing this interactively :
-----
#!/bin/sh

echo -n "> Clean up (y/n) ?"
read r
if (test $y = "o") then
find $HOME \( -name core        -o -name a.out    -o -name '*.test'    \
           -o -name '_ted.sav*' -o -name '*.old'  -o -name '.*.old'    \
           -o -name '*BAK'      -o -name '*.CKP'  -o -name '.*.BAK'    \
	   -o -name '.*.CKP'    -o -name '#*'     -o -name '*~'        \
           -o -name '.*~'    -o -name 'saved_co*' -o -name dead.letter \) \
-exec rm -i {} \;
fi
# Notice we have both GNUemacs and Unipress ;-)
-----

I wanted to complete this tool by adding a -b switch for doing it in
background. That is, without the -b it would work like before, with -b it
would do a
   nohup find .... &

The easy solution, and the only one I managed to get working, is to
duplicate the whole find command twice, one for -b, one without.

I wanted to define a variable. First, i tried :

CLEAN="find $HOME \( -name core        -o -name a.out    -o -name '*.test'    \
           -o -name '_ted.sav*' -o -name '*.old'  -o -name '.*.old'    \
           -o -name '*BAK'      -o -name '*.CKP'  -o -name '.*.BAK'    \
	   -o -name '.*.CKP'    -o -name '#*'     -o -name '*~'        \
           -o -name '.*~'    -o -name 'saved_co*' -o -name dead.letter \)"

and called by :

    $CLEAN -exec /bin/rm -i {} \;
or
    nohup $CLEAN -exec /bin/rm -f {} \; &

It didn't work, it seemed that the special characters ', * and \ were
interpreted wrong. I tried of course to quote them and so on, without
success.

I then tried :

FILES="-name core        -o -name a.out    -o -name '*.test'    \
           -o -name '_ted.sav*' -o -name '*.old'  -o -name '.*.old'    \
           -o -name '*BAK'      -o -name '*.CKP'  -o -name '.*.BAK'    \
	   -o -name '.*.CKP'    -o -name '#*'     -o -name '*~'        \
           -o -name '.*~'    -o -name 'saved_co*' -o -name dead.letter"

with
     find \( $FILES \) ...

and I removed even the \ to have $FILES on one line only. No success. The
best I achieved was no error message, the find ran for a while, but removed
nothing (or maybe only the core files).

I suspect it to be an interference between the shell script, the special
characters, the variable expansion and the globbing !!! Is there a solution
or shall I stick to the inelegant solution of duplicating the command ?

--- Karl Tombre @ CRIN (Centre de Recherche en Informatique de Nancy)
EMAIL : tombre@crin.crin.fr  --   tombre@crin.UUCP
POST  : Karl Tombre, CRIN, B.P. 239, 54506 VANDOEUVRE CEDEX, France
PHONE : +33  83.91.21.25