HCI Data Ltd
Find and Xargs
Home Internet tools
 

Ever done some work on a LINUX system and cannot remember where it was saved?

Enter the super-heros of LINUX - the 'find' and 'xargs' commands. Each is a powerful command in its own right, but when combined produce very useful output.

Find

The Linux 'find' command will list files and directories that match the arguments to the command and pass specified tests. For example, to find all 'txt' files in the home directory, the following command can be used:

find ~ -name *.txt

The '~' means start at the user's home directory and the -name is a test which means list only files with that particular name. Find has many tests but some of the most useful for finding files that have been updated recently are the -mtime and -mmin tests.

mmin
This test is used to find files modified within 'n' minutes
mtime
This test is used to find files modified within 'n' days

Some examples will make this clearer.

Find All Files Modified in the Last 90 Minutes

find ~ -mmin -90

Note that the number of minutes (90) is prefixed with a '-'. The reason for this will become apparent later. A sample output could be

        
	/home/linux
	/home/linux/dns/mysql-outfile
	/home/linux/dns/mysql-outfile/dnsx.txt
	/home/linux/dns/mysql-outfile/dnsx.doc
        
      

It looks as if the 'find' command has listed files and directories. If we only want to see the files, add the -type test to the command to specify files only.

find ~ -type f -mmin -90

The sample output would then become

        
	/home/linux/dns/mysql-outfile/dnsx.txt
	/home/linux/dns/mysql-outfile/dnsx.doc
        
      

The information is now more concise, but which was the last file modified? You could issue a 'ls' command against each file in turn, but that could be very time consuming if there are more than a couple of files. What is needed is our other super-hero - xargs - with different powers.

Adding Xargs to Find

Xargs' power lies in the fact that it can take the output of one command, in this case find, and use that output as arguments to another command. So, using the basic find command above, let us pass the output of find to xargs and get xargs to issue multiple 'ls -l' commands.

find ~ -type f -mmin -90 | xargs ls -l

The sample output would then become

        
	-rw-rw-r--    1 linux    lunux    10209032 Jun 30 13:28 /home/linux/dns/mysql-outfile/dnsx.doc
	-rw-rw-rw-    1 mysql    mysql    10209032 Jun 30 12:53 /home/linux/dns/mysql-outfile/dnsx.txt
        
      

Negative, Positive and Unsigned Times

In the above examples the number of minutes was specified as a negative number. This tell the find command that you wish to list files modified LESS THAN the specified number of minutes ago. If you had used a positive value, for example +300 , find would have returned a list of files modified MORE THAN 300 minutes ago. If you had used an unsigned value, for example 10 , find would have returned a list of files modified EXACTLY 10 minutes ago. This unsigned operand is not very useful for the mmins test.

Find All Files Modified More Than 5 Years Ago

In this example of the find and xargs command, we will use a positive time and the mtime test. The operand value to mtime is the number of 24 hour periods. It is not the number of days and the reason why will become apparent if you read 'man find'. So, to see files over 5 years old will will use +1825 as the value for mtime. We have ignored leap years in calculating 5 years as 5*365 days. The command issued is

find ~ -type f -mtime +1825 |xargs ls -l

A sample output could be

        
	-rw-r--r--    1 linux  linux       244 Jun 27  2000 /home/linux/marks/class4/ACCBLUE.TXT
	-rw-r--r--    1 linux  linux     12288 Jun 27  2000 /home/linux/marks/class4/ACCBLUE.XLS
	-rw-r--r--    1 linux  linux       266 Jun 27  2000 /home/linux/marks/class4/ACCCRABB.TXT
	-rw-r--r--    1 linux  linux     11776 Jun 27  2000 /home/linux/marks/class4/ACCCRABB.XLS
	-rw-r--r--    1 linux  linux       584 Jun 27  2000 /home/linux/marks/class4/Acclisa.txt
	-rw-r--r--    1 linux  linux     13824 Jun 27  2000 /home/linux/marks/class4/Acclisa.xls
	-rw-r--r--    1 linux  linux       264 Jun 27  2000 /home/linux/marks/class4/ACCPEAK.TXT
	-rw-r--r--    1 linux  linux     11776 Jun 27  2000 /home/linux/marks/class4/ACCPEAK.XLS
	-rw-r--r--    1 linux  linux       180 Jun 27  2000 /home/linux/marks/class4/ACCPHBH.TXT
	-rw-r--r--    1 linux  linux     12288 Jun 27  2000 /home/linux/marks/class4/ACCPHBH.XLS

Tell xargs when to Quit

One problem with the above approach is that a complete listing of the current directory will occur if the find command does not find any files! Xargs sees a list of zero files, but still issues the 'ls -l' command. To overcome this, simply use the xargs option '-r' which means If the standard input does not contain any nonblanks, do not run the command. So, our command now becomes:

find ~ -type f -mtime +1825 |xargs -r ls -l

Note that the '-r' is an xargs option and therefore comes after the xargs command name but before the command to be issued - in this case 'ls -l'.

Summary

The find command is a very useful command for finding files in a LINUX system. Combining find with xargs makes it a very powerful command.




HCI Data Ltd is a member of the Federation of Small Businesses
Last Updated: Saturday, 23-Jan-2016
HCI Data Ltd.