3.3.3.3. Find and locate
These are the real tools, used when searching other paths beside
those listed in the search path. The find
tool, known from UNIX, is very powerful, which may be the cause of
a somewhat more difficult syntax. GNU find,
however, deals with the syntax problems. This command not only
allows you to search file names, it can also accept file size, date
of last change and other file properties as criteria for a search.
The most common use is for finding file names:
find <path>
-name <searchstring>
This can be interpreted as "Look in all
files and subdirectories contained in a given path, and print the
names of the files containing the search string in their
name" (not in their content).
Another application of find is for
searching files of a certain size, as in the example below, where
user peter wants to find all files in the current
directory or one of its subdirectories, that are bigger than 5
MB:
peter:~> find . -size +5000k
psychotic_chaos.mp3
|
If you dig in the man pages, you will see that find can also perform operations on the found files.
A common example is removing files. It is best to first test
without the -exec option that the correct
files are selected, after that the command can be rerun to delete
the selected files. Below, we search for files ending in .tmp:
peter:~> find . -name "*.tmp" -exec rm {} \;
peter:~>
|
|
Optimize! |
|
This command will call on rm as many
times as a file answering the requirements is found. In the worst
case, this might be thousands or millions of times. This is quite a
load on your system.
A more realistic way of working would be the use of a pipe (|)
and the xargs tool with rm as an argument. This way, the rm command is only called when the command line is
full, instead of for every file. See
Chapter 5 for more on using I/O redirection to ease everyday tasks.
|
Later on (in 1999 according to the man pages, after 20 years of
find), locate was
developed. This program is easier to use, but more restricted than
find, since its output is based on a file
index database that is updated only once every day. On the other
hand, a search in the locate database uses
less resources than find and therefore shows
the results nearly instantly.
Most Linux distributions use slocate
these days, security enhanced locate, the modern version of
locate that prevents users from getting
output they have no right to read. The files in root's
home directory are such an example, these are not normally
accessible to the public. A user who wants to find someone who
knows about the C shell may issue
the command locate .cshrc, to display all users who have a
customized configuration file for the C
shell. Supposing the users root and jenny
are running C shell, then only the
file /home/jenny/.cshrc will be
displayed, and not the one in root's home directory. On
most systems, locate is a symbolic link to
the slocate program:
billy:~> ls -l /usr/bin/locate
lrwxrwxrwx 1 root slocate 7 Oct 28 14:18 /usr/bin/locate -> slocate*
|
User tina could have used locate
to find the application she wanted:
tina:~> locate acroread
/usr/share/icons/hicolor/16x16/apps/acroread.png
/usr/share/icons/hicolor/32x32/apps/acroread.png
/usr/share/icons/locolor/16x16/apps/acroread.png
/usr/share/icons/locolor/32x32/apps/acroread.png
/usr/local/bin/acroread
/usr/local/Acrobat4/Reader/intellinux/bin/acroread
/usr/local/Acrobat4/bin/acroread
|
Directories that don't contain the name bin can't contain the program - they don't contain
executable files. There are three possibilities left. The file in
/usr/local/bin is the one tina
would have wanted: it is a link to the shell script that starts the
actual program:
tina:~> file /usr/local/bin/acroread
/usr/local/bin/acroread: symbolic link to ../Acrobat4/bin/acroread
tina:~> file /usr/local/Acrobat4/bin/acroread
/usr/local/Acrobat4/bin/acroread: Bourne shell script text executable
tina:~> file /usr/local/Acrobat4/Reader/intellinux/bin/acroread
/usr/local/Acrobat4/Reader/intellinux/bin/acroread: ELF 32-bit LSB
executable, Intel 80386, version 1, dynamically linked (uses
shared libs), not stripped
|
In order to keep the path as short as possible, so the system
doesn't have to search too long every time a user wants to execute
a command, we add /usr/local/bin to the
path and not the other directories, which only contain the binary
files of one specific program, while /usr/local/bin contains other useful programs as
well.
Again, a description of the full features of find and locate can be found
in the Info pages.