left-icon

Linux Succinctly®
by Jason Cannon

Previous
Chapter

of
A
A
A

CHAPTER 9

Finding, Sorting, and Comparing Files and Directories

Finding, Sorting, and Comparing Files and Directories


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

$

  1. Common find Commands

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

$

Sorting

Use the sort command to sort the contents of files.

  1. Commonly Used sort Options

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

$

Comparing

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.

Scroll To Top
Disclaimer
DISCLAIMER: Web reader is currently in beta. Please report any issues through our support system. PDF and Kindle format files are also available for download.

Previous

Next



You are one step away from downloading ebooks from the Succinctly® series premier collection!
A confirmation has been sent to your email address. Please check and confirm your email subscription to complete the download.