xargs

Reads a list from the standard input and executes the commands sequentially. This is a very useful command, and I think it is a must-have command for executing file operations in the CUI. It is a very useful command, and I think it is essential for file manipulation in CUI.

XARGS(1) BSD General Commands Manual

NAME
     xargs -- construct argument list(s) and execute utility

SYNOPSIS
     xargs [-0opt] [-E eofstr] [-I replstr [-R replacements]] [-J replstr]]
           [-L number] [-n number [-x]] [-P maxprocs] [-s size]]
           [-P maxprocs] [-s size]] [-utility [argument ...]]

github

  • The file in jupyter notebook format on github is here.

google colaboratory

  • To run it in google colaboratory here xargs/xargs_nb.ipynb)

environment

The author’s OS is macOS, and the options are different from those of Linux and Unix commands.

When you actually run the command, the leading ! and %%bash in the first line.

!sw_vers
ProductName: Mac OS X
ProductVersion: 10.14.6
BuildVersion: 18G95
!bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.

Usage examples

This is a very useful command and has many uses. Here are some examples of commands that I often use.

Use ls to rename files in bulk.

ls | grep XXXX | xargs -I{} cp {} {}.bk

Search for files containing XXXX and take a backup of those files, using I{} to get the arguments before passing them down the pipe.

%%bash
echo "Create three files with the string "temp"."
echo "temp1" > temp1
echo "temp2" > temp2
echo "temp3" > temp3

ls | grep temp
Create three files with the string "temp".
temp1
temp2
temp3

Create a backup file for these three files.

%%bash
ls | grep temp | xargs -I{} cp {} {}.bk

echo "<file>"
ls | grep temp
<file>
temp1
temp1.bk
temp2
temp2.bk
temp3
temp3.bk

and the backup will be created in bulk.

Bulk delete files containing a specific string

Deletes all files that contain the string abc. Very useful.

%%bash
echo "Create 5 files with the name abc"
echo "abc" > abc1
echo "abc" > abc2
echo "abc" > abc3
echo "abc" > abc4
echo "abc" > abc5

ls | grep abc
Create five files with the name "abc
abc1
abc2
abc3
abc4
abc5
ls | grep abc | xargs -I{} rm {}
! ls | grep abc
abc4 abc5

and the five files with the string abc were deleted.

Do a recursive search for filenames with XXX in them and replace them all with YYY.

grep XXX -rl . | xargs sed -i.bk -e 's/XXX/YYYY/g'

Do a recursive search for filenames with XXX in them and replace all with YYY

find . / -type f | sed 'p;s/aaa/bbb/' | xargs -n2 mv

As mentioned above, this command is very easy to use, so please use it according to your own needs to improve your work efficiency.

Typical options

You can use xargs -I{} to get the result before the pipe as an argument, which is very useful.

  • I{}