Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: script within find

A while ago, Stephane suggested a terrific script on doing things
right inside find's exec.
I'm using that magic advice and it works, fantastic!  Still it's a bit
of a mystery to me.  Why do we need {} {} twice -- although there's
only one parameter reference to $1?

Also, how would I generalize it for two commands inside the script?
Here's an example.  I want to convert a bunch of .tif files to .jpg's.
The original tifs reside in certain directory structure which should
be preserved in the target directory.

That is, we have something like


And we need to create


The command to do a single conversion is

convert -quality 100 dir1/A.tif /jpgs/dir1/A.jpg

-- however, we must ensure

mkdir -p /jpgs/`dirname {}` # or some such

-- before we invoke convert with the target path, to make sure it exists.

How can I stick *two* commands inside the exec in a find?


On 2/24/07, Stephane Chazelas <Stephane_Chazelas@xxxxxxxx> wrote:
On Fri, Feb 23, 2007 at 11:39:40PM -0800, Alexy Khrabrov wrote:
> Here's a mystery solving which I've avoided for a while.  Now that I'm
> going to publish a recipe for fixing Photoshop installation on a
> case-sensitive Mac drive, I'd like to compress it into one script.
> The problem is, the script contains a find command, which passes all
> things it finds via -exec to a small helper script.  The helper script
> is necessary since it seems difficult to make -exec contain a single
> in-line command to do it.  Here they are:
> -- the find command:
> find . -name a -exec ~/bin/fix-ps-cs2.sh {} \;
> -- the helper script, ~/bin/fix-ps-cs2.sh:
> #!/bin/sh
> DIR=`dirname $1`
> (cd $DIR; ln -s a A)
> as you see, it needs to invoke dirname on the argument, then create a
> symlink in that dirname.
> Can the helper script be avoided and all the work done within the
> single find command?

Not sure what that has to do with zsh, but on MAC OSX, I'd
expect find to have a -execdir:

find . -name a -execdir ln -s a A \;


find . -name a -exec sh -c 'ln -s a "${1%a}A"' {} {} \;


Messages sorted by: Reverse Date, Date, Thread, Author