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.