Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents

Detailed Articles

Page Tree
root

...

@self

xargs

Is a very useful program to take a list and run commands against that list. xargs will take a list of arguments, loop through them and run a command against 1 or more arguments at a time.

Tip

If you like xargs you might want to check out GNU Parallel.

Basic Example

Here is a really straightforward example of using xargs to calculate a MD5 hash on every file in the current directory,

Useful One Off Recipes

Disk Management

List directories from largest to smallest at the top level only. On older system h will not work and you must use k.

Code Block
languagebash
lsdu |-sh xargs* -t -n1 md5

This is how it works,

  • -t will show you what xargs is about to execute before it executes it.
  • -n1 specifies that xarg work with he arguments passed by the directory to x arguments at a time, in this case one argument at a time.

Thanks to the -t the output will be shown on screen,

Code Block
languagebash
md5 planetary.doc
MD5 (bash) = ab5970d50d67bcafe5c554387f76534e
md5 Superman.jpg
MD5 (cat) = cdefa50d737dfcf8dc57886ea1a758c4

Substitution to Rename Files

Now let's get more advanced and use -I to allow substitution. First we'll create a some temporary files,

Code Block
languagebash
mkdir temp
cd temp
touch files1 file2 file3 # Creates 3 empty files

Now using xargs we will add the txt extension to each file,

Code Block
languagebash
ls | xargs -t -I {} mv {} {}.txt
mv file1 file1.txt
mv file2 file2.txt
mv file3 file3.txt

...

| sort

Long Running Processes

Look for long running processes,

Warning

To write.

Information

Last

Last searches back through the file /var/log/wtmp  (or the file designated by the -f flag) and displays a list of all users logged in (and out) since that file was created. 

Lastb

Lastb is the same as last, except that by default it shows a log of the file /var/log/btmp, which contains all the bad login attempts.

Quck String Manipulation

Quick reference of manipulating standout,

Code Block
languagebash
ls | xargs -t -I varX md5 varX
md5 file1.txt
MD5 (file1.txt) = d41d8cd98f00b204e9800998ecf8427e
md5 file2.txt
MD5 (file2.txt) = d41d8cd98f00b204e9800998ecf8427e
md5 file3.txt
MD5 (file3.txt) = d41d8cd98f00b204e9800998ecf8427e
Note

One item I don't understand yet is why {} forces arguments to be iterated through one at a time. Also, how would we allow more than one argument? -n2 will not work.

Debugging Xargs with echo

The echo command is useful to test and see what xargs will be looping through,

Code Block
languagebash
ls | xargs -I {} echo "mv {} {}.txt"
mv file1 file1.txt
mv file2 file2.txt
mv file3 file3.txt

General Search

Ubuntu has mlocate but on other systems you will need to use find,

Code Block
languagebash
find / -name [filename] -print # find a file
find / -size +51024 -print     # where 51024 is in Kilobytes which is approximately 5MB

Search Inside of Files

Try to memorize this command,

Code Block
languagebash
find [folder] -type f | xargs -I {} grep -li "text" {}

find [folder] -type f                  # search the specified folder for all files, returns full path of each file
    | xargs -I {} grep -li "[text]" {} # piped into xargs to grep for all files containing specified text ignoring case

Search & Replace Inside of Files

...

echo "some_file_name.txt" | tr "_" " " # result will be "some file name.txt"
paste oldName.txt newName.txt > runMe.txt # connects line by line to contents of both files together

 

Integrity Checking

MD5

Check if a file is corrupt,

Code Block
languagebash
find# [folder] -type f | xargs -I {} grep -li "text" {} | xargs perl -pi -e 's/[text_to_search_for]/[text_to_search_for]/g'

find [folder] -type f                  # search the specified folder for all files, returns full path of each file
    | xargs -I {} grep -li "[text]" {} # piped into xargs with to grep for all files containing specified text ignoring case
    | xargs perl -pi -e 's/[text_to_search_for]/[text_to_replace_with]/g' # pipe list of files and using perl search and replace with specified text

Disk Management

List directories from largest to smallest at the top level only. On older system h will not work and you must use k.

Code Block
languagebash
du -sh * | sort

Long Running Processes

Warning

To write.

Other Useful Commands

Code Block
languagebash
On Ubuntu
md5sum /path/to/file

# On Solaris
digest -a md5 -v /path/to/file