On Thu, Dec 12, 2013 at 02:32:03PM -0500, Andrew Gwozdziewycz wrote:
> find(1) seems very un-unixy, but it's very powerful.

It's not, though, because ultimately it's just a file system walk with a
system for querying stat(2). No, the problem I have with find is that
its output is not necessarily safe for easy usage in common shell
situations. That's what I have zsh's globbing for. (Seriously, recursive
globbing is the only reason I don't use mksh yet)

> Let's assume for
> a minute that find didn't exist. How would you do the following:
> 
>  1. execute a command for each file (find . -exec whatever {} \;)

whatever **/*

>  2. find files that are > 8M

print -l **/*(LM+8)

>  3. find files that are older than 20 days

print -l **/*(m+20)

>  4. find all files that are owned by 'joe' that also have execute
> permissions for world
> 

print -l **/*(u.joe.X)

[...]
> Thoughts? Pointers to tools that already do this?
> 

All of the above have the same problem: If I do

for i in $(find . -foo); do
...
done

then this will fail if any file contains something in IFS. If I do

find . -foo | while read line; do
...
done

then this will fail for files with a newline in the name. Granted, that
doesn't happen often, but I don't want to think about such trivialities
in shell scripts that might work with untrusted data. If I do

for i in **/*(flags); do
...
done

then zsh will expand the glob correctly, no matter what those file names
contain. And in none of the above is the situation improved by replacing
find by another, more limited tool, because the problem is the interface
between tools and the shell.

> Cheers,
> 
> Andrew
> -- 

I think that should be dash-dash-space.

Ciao,
Markus

Reply via email to