Globbing

Oliver Fromme check+jw8aa100rsueqp0r at fromme.com
Thu Feb 14 05:06:38 PST 2008


Simon 'corecode' Schubert wrote:
 > Rahul Siddharthan wrote:
 > > For example, how do you use "find" to find all files in a directory
 > > that end in ".el" and don't have a corresponding ".elc" file?  
 > > Answer:
 > >  find . -name '*.el' -print  \
 > >     |sed 's/^/FOO=/' \
 > >     |sed 's/$/; if [ ! -f ${FOO}c ]; then echo $FOO; fi/'  \
 > >     | sh

There are dozens of ways to do it.  The above answer is
certainly not the best one.  Except if the intention is
to demonstrate how difficult it is.  :-)

 > I'd go for (if only in the current directory, not subdirs)
 > 
 > for f in *.el
 > do
 >        [ -f "${f}c" ] || echo "$f"
 > done

That's much better.  I would do it this way (doesn't
require any shell loops, so it's more efficient):

ls *.el *.elc | sed 's/c$//' | uniq -c | awk '$1==2{print $2}'

I don't think anyone has so many .el files that it
will overflow argmax, so I simply used ls.  Otherwise
"echo *.el *.elc | tr ' ' '\n' | ..." instead will do
for any number of files.

With zsh's extended globbing, the problem can be
solved thusly:

echo *.el(e:'[ -f ${REPLY}c ]':)

And to include subdirectories recursively, only a
simple modification is required:

echo **/*.el(e:'[ -f ${REPLY}c ]':)

Best regards
   Oliver

-- 
Oliver Fromme, secnetix GmbH & Co. KG, Marktplatz 29, 85567 Grafing b. M.
Handelsregister: Registergericht Muenchen, HRA 74606,  Geschäftsfuehrung:
secnetix Verwaltungsgesellsch. mbH, Handelsregister: Registergericht Mün-
chen, HRB 125758,  Geschäftsführer: Maik Bachmann, Olaf Erb, Ralf Gebhart

FreeBSD-Dienstleistungen, -Produkte und mehr:  http://www.secnetix.de/bsd





More information about the Kernel mailing list