[Courses][Linux comands] Finding things with locate, find, and grep
carla at bratgrrl.com
Tue Feb 17 23:30:35 EST 2004
Finding things on Linux can get incredibly complex, especially if you ask a
regular expression guru for help. By the time they're done helping you, you
feel inferior and too lowly to be worthy of Linux. While being able to find a
specific comma on a 160-gigabyte hard drive is fun, or a particular instance
of the word "the," you can actually do quite a lot with the three basic Linux
finding-things utilities: locate, find, and grep. Locate and find search for
files, and grep searches for text in files.
Locate is the easiest. It maintains its own database of files on your system,
so it's blazing fast. Some distros install with a cron job that rebuilds the
locate database regularly. However you do it, it must be updated
Finding files is like so easy:
$ locate filename
Do a case-insensitive search:
$ locate -i filename
It is typical that locate will return a skillion hits. Locate and grep
together are the Dynamic Duo:
$ locate -i tuxracer | grep -i readme
Now suppose you need to find a file with a particular bit of text in it. grep
is wicked cool for searching dmesg:
$ dmesg | grep -i usb
usb.c: registered new driver usbdevfs
usb.c: registered new driver hub
host/usb-uhci.c: $Revision: 1.275 $ time 20:17:46 Aug 3 2003
host/usb-uhci.c: High bandwidth mode enabled
host/usb-uhci.c: USB UHCI at I/O 0xd800, IRQ 11
host/usb-uhci.c: Detected 2 ports
Blah blah, and there are many more lines like this. Grep prints the whole line
each time it finds your search string. dmesg is a special case, as it is a
command, and not just a text file. For example, to search an ordinary text
file, such as the XFree log, for references to 'glcore', this is the normal
# grep -iw glcore XFree86.0.log
(II) LoadModule: "GLcore"
(II) Module GLcore: vendor="The XFree86 Project"
(II) Loading sub module "GLcore"
(II) LoadModule: "GLcore"
grep - options - search string - file to search
The -w flag means 'whole word search.' Which is really handy, because
otherwise grep returns every single line that contains your search string.
Here is the kewlest grep trick of all: searching bales of files for a word or
string or regexp. CD to the directory you want to search, then:
$ grep -lir "word" *
-l means print only the filenames containing your search term, -r is
recursive, and * means all files. If you omit the -l flag, it prints the
filenames and the lines containing your search term:
$ grep -ir swap *
Lesson5.html:chuck the data, and none of the other options matter. A swap
Lesson5.html:initialised with <code>mkswap /dev/something</code>, and can be
Lesson5.html:manually activated with <code>swapon /dev/something</code>,
Find is wicked cool. Do this to search for a file named arrow.jpg:
$ find / -name arrow.jpg
That tells find to start its search from /. Maybe you only know part of the
filename, so give it some wildcards. This searches your home directory for
filenames that start with arrow, and can end with anything:
$ find ~ -name 'arrow*'
Maybe you only want 'arrow' images in .xbm format:
$ find ~ -name 'arrow*.xbm'
Or all the .xbm files in the home directory:
$ find ~ -name '*.xbm'
A cool thing with find is tracking down orphaned files, after you've booted a
user off the system. You need to locate all the files that belonged to that
user. Oops, their account is long gone, so you can't search by login name. No
problem, search on their UID:
# find / -uid 1005
If you're searching system directories as a lowly unprivileged user, you'll
generate bales of error messages. These are like, so depressing, so they must
be suppressed, or redirected into the bitbucket, hahaha:
# find / -uid 1005 2>/dev/null
OK that's enough for this week!
this message brought to you
by Libranet 2.8 and Kmail
More information about the Courses