[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: find question (and xargs)



On 14 May 1996, Kai Henningsen wrote:

> It's find that does the replacing. None of the {}s are in the find
> arguments, however. (And rm is not even in the xargs arguments!)
>
> Personally, I'd probably make a script for the split-and-remove, but
> it should also work with a shell function.

A function probably wont work - without some overly complicated tricks,
a shell function is only available within the context/scope of the shell
or shell script which defines it.  Programs forked by that shell or
shell script can't exec it because it's not a program as far as they're
concerned.

This seems weird and possibly counter-intuitive, but it does make sense.

It can produce some very unexpected behaviour if you're not used to
it. 

My rule of thumb is to only use functions within the context of a
specific shell script, and not to expect them to be available in
sub-shells or shell scripts where they haven't been explicitly defined.
Of course, i could start all shell scripts with something like "source
~/myfuncs.sh" but that would be overkill (and ugly!).


> Anyway, I'd probably try something like this:
> 
> find / -size +459976c -noleaf -type f -name '*.deb' -exec split.sh {} \;
> 
> #! /bin/sh
> dpkg-split -s "$1" && rm "$1"

if you're going to write a script, it's faster to use xargs, that way
the script only needs to be forked once.


find / -size +459976c -noleaf -type f -name '*.deb' | xargs split.sh 

#! /bin/bash
for pkg in $@ ; do 
  dpkg-split -s "$pkg" && rm "$pkg"
done


split.sh could even be written to take a list of files on stdin and process
them accordingly.  more effort than what it's worth IMO, let xargs do the
job :-)

Craig


Reply to: