CHAPTER 9
To locate files or directories on a Linux system, you can use the find command. You can find files by owner, size, permissions, name, modification time, and more.
find [path...] [expression] Recursively find files and directories in path that match expression. When running find without arguments, path is assumed to be the current directory.
$ find . ./.bash_history ./Pictures ./.bashrc ./Downloads ./.bash_logout ./.viminfo ./Desktop ./Documents ./goals.txt ./to-do.txt ./.profile ./Music ./Music/JohnColtrane $ |
Description | Command |
|---|---|
Display items whose names match pattern (case sensitive). | find . -name pattern |
Same as -name, but not case sensitive. | find . -iname pattern |
Perform an -ls operation on each of the items. | find . -ls |
Display items that are number_of_days old. | find . -mtime number_of_days |
Display items that are size number. The number can be followed by a character, which represents the unit of space: c for bytes, k for kilobytes, M for megabytes, and G for gigabytes. | find . -size number |
Display items that are newer than file. | find . -newer file |
Run command against each of the found items. The braces ({}) act as a placeholder for the current file being processed. | find . -exec command {} \; |
The following are examples of using the find command. You can combine multiple find options, or expressions, to find exactly what you are looking for.
$ find /etc -name log*conf /etc/logrotate.conf $ find /opt -name Nginx $ find /opt -iname Nginx /opt/nginx $ find /opt -iname Nginx -ls 655431 4 drwxr-xr-x 2 root root 4096 Jul 1 03:34 /opt/nginx $ find . -mtime +11 -mtime -14 ./.bashrc ./.viminfo $ find . -size +2M ./Music/JohnColtrane/giantsteps.mp3 $ find . -type d -newer to-do.txt . ./Music/JohnColtrane $ find . -name *mp3 -exec mpg123 {} \; High Performance MPEG 1.0/2.0/2.5 Audio Player for Layers 1, 2 and 3 version 1.12.1; written and copyright by Michael Hipp and others free software (LGPL/GPL) without any warranty but with best wishes Directory: ./Music/JohnColtrane/ Playing MPEG stream 1 of 1: giantsteps.mp3 ... Title: Giant Steps MPEG 1.0 layer III, 192 kbit/s, 44100 Hz stereo [0:00] Decoding of giantsteps.mp3 finished. $ |
The find command examines each file and directory in the provided path to determine if it matches the given expression. Sometimes this is a very quick operation if only a small number of items have to be examined. However, if you were to run find / -name some_name, find would examine every single file on the system and this could potentially be a slow process. There is another utility that you can use to find items on a Linux system and it's called locate.
locate pattern Display files and directories that match pattern.
The locate command queries an index, or database, which is updated daily by a process named updatedb. The advantage to this approach is that it's really fast since it doesn't have to examine files and directories in real time. The disadvantage is that it is not in real time. The locate command is great for finding files or directories that are older than a day, but it won't find items that have just been created. Also, locate and updatedb are sometimes not installed or enabled.
$ locate giant /home/jason/Music/JohnColtrane/giantsteps.mp3 $ locate httpd.conf /etc/apache2/httpd.conf $ |
Use the sort command to sort the contents of files.
Description | Option |
Sort the text in file. | sort file |
Sort by "key." Sort by the FIELD_NUM column. | sort -k FIELD_NUM file |
Sort in reverse order. | sort -r file |
Sort uniquely. No duplicates are displayed. | sort -u file |
$ cat random-states Tennessee Nashville Wyoming Cheyenne Indiana Indianapolis Indiana Indianapolis Arizona Phoenix Colorado Denver Indiana Indianapolis Georgia Atlanta $ sort random-states Arizona Phoenix Colorado Denver Georgia Atlanta Indiana Indianapolis Indiana Indianapolis Indiana Indianapolis Tennessee Nashville Wyoming Cheyenne $ sort -u random-states Arizona Phoenix Colorado Denver Georgia Atlanta Indiana Indianapolis Tennessee Nashville Wyoming Cheyenne $ sort -k2 -u random-states Georgia Atlanta Wyoming Cheyenne Colorado Denver Indiana Indianapolis Tennessee Nashville Arizona Phoenix $ |
You can use the diff, sdiff, and vimdiff commands to compare files and directories. The diff command displays just the differences, sdiff displays the two files side-by-side while highlighting the differences, and vimdiff uses the Vim editor to display the differences. Simply supply the command two items to compare.
$ cat random-states Arizona Phoenix Colorado Denver Georgia Atlanta Indiana Indianapolis $ cat random-states.bak Arizona Phoenix Colorado Denver Georgia Savannah Indiana Indianapolis $ diff random-states random-states.bak 3c3 < Georgia Atlanta --- > Georgia Savannah $ sdiff random-states random-states.bak Arizona Phoenix Arizona Phoenix Colorado Denver Colorado Denver Georgia Atlanta | Georgia Savannah Indiana Indianapolis Indiana Indianapolis $ vimdiff random-states random-states.bak Arizona Phoenix | Arizona Phoenix Colorado Denver | Colorado Denver Georgia Atlanta | Georgia Savannah Indiana Indianapolis | Indiana Indianapolis random-states 1,1 All random-states.bak 1,1 All "random-states.bak" 4L, 104C $ tree . |-- dir1 | |-- file1 |-- dir2 |-- file1 |-- file2 2 directories, 3 files $ diff dir1 dir2 Only in dir2: file2 $ |
In the diff output, the text following the less than sign belongs to the first file while the text following the greater than sign belongs to the second file. Also diff provides information about the differences in a shorthand format. The first number represents line numbers from the first file. The next character will be a c for change, a d for deletion, or a for an addition. The final number represents lines from the second file.
The sdiff command uses a pipe to represent changes on the same line. The less than sign is used to denote that particular line only exists in the first file, while the greater than sign means the line only exists in the second file.