This is quite old post. I started to write it in October 2010, but could not properly polish it for a long time.
Today I would like to present an example of usage of
find (and
grep) rooted in
Crux. Let say that I want to find all packages in version
20100511 (this was true scenario when I wanted to update e17 related ports). Translating into less Crux specific language it means that I had to find all Pkgfile files (simple
find), which had string
20100511 (simple
grep). I needed only file names not a matching string so I used
-l option for
grep.
find . -name Pkgfile -exec grep -l 20100511 {} \;
I not only needed to find all old files but to updated them as well (to version 1.0.0.beta that time). I used the same find but exchanged
grep to
sed (with option
-i for "in place").
find . -name Pkgfile -exec sed -i 's/20100511/1.0.0.beta/ {} \;
Let push our example one step further. I wanted to find dependence for packages, therefore I ran following command.
grep -i depen `find . -name Pkgfile -exec grep -l beta {} \;
What used previous command to create a list of files to hunted through for word beta. (I wasn't sure if word "dependence" begun lower or upper case so used option
-i for
--ignore-case).
In UNIX world there are always more than one way of doing things and in our scenario the
find -exec can be replace with a separate command
xargs.
Xargs might be very useful in many cases because can be use to create unix command from standard input. Using
xargs rather then
find -exec my first example would be:
find . -name Pkgfile | xargs grep -l beta $1
Let use
xargs for another task related to above example. In my scenario I had not only to update the version, but also to change the sources of the packages. To do that I used
find,
xargs and
sed in a
for loop.
for file in `find . -name Pkgfile | xargs grep -l beta $1 2&> /dev/null` ; \
do \
sed -i 's/pitillo.mine.nu\/crux\/distfiles/download.enlightenment.org\/releases/' $file; \
done
The above command might be one liner, but can be paste line by line. It used the command from the previous example to create the
$file array consist of names of files with word "beta". Elements from
$file were use as input for sed command.