[NTLUG:Discuss] "find -exec" -vs xargs -OR- subshells in -exec
Stuart Johnston
saj at thecommune.net
Fri May 26 09:53:44 CDT 2006
Richard Geoffrion wrote:
> I'm trying to rename a bunch of mangled files. I want to replace all of
> the tilde (~) characters with dashes (-).
>
> Find can find the files, but I can't figure out how to rename the file
> once I have it on the command line.
> (and for the purposes of this issue...on this particular machine, I
> don't have the rename command ---- even though I tried using rename on
> another machine with no luck.)
> (I hate it when machines have no luck)
>
> rtcg at bobpc:/tmp# mkdir test
> rtcg at bobpc:/tmp# cd test
> rtcg at bobpc:/tmp/test# ls
> rtcg at bobpc:/tmp/test# touch 1~1.jpg
> rtcg at bobpc:/tmp/test# find . -name *~*
> ./1~1.jpg
> rtcg at bobpc:/tmp/test# find . -name *~* -exec mv {} `echo {} | sed y#~#-#` \;
> mv: `./1~1.jpg' and `./1~1.jpg' are the same file
> rtcg at bobpc:/tmp/test# TESTFILE=1~1.jpg
> rtcg at bobpc:/tmp/test# mv $TESTFILE `echo $TESTFILE | sed y#~#-#`
> rtcg at bobpc:/tmp/test# ls
> 1-1.jpg
> rtcg at bobpc:/tmp/test#
>
>
> I've looked at xargs, but xargs just wants to run a command on the
> results. I can't find how to manipulate the ??stout/stin'? that was
> passed to xargs.
>
>
> Suggestions?
rename works well for me.
$ touch 1~1.jpg
$ find . -name *~* -exec rename 'y/~/-/' {} \;
$ ls
1-1.jpg
rename is just a perl script so you could probably copy it over to your
system. Or, move your mv and sed commands into a shell script and run
that from find:
$ cat ren
#!/bin/bash
mv $1 `echo $1 | sed y#~#-#`
find . -name *~* -exec ./ren {} \;
More information about the Discuss
mailing list