The Computer Oracle

What is difference between xargs with braces and without in Linux?

--------------------------------------------------
Rise to the top 3% as a developer or hire one of them at Toptal: https://topt.al/25cXVn
--------------------------------------------------

Music by Eric Matyas
https://www.soundimage.org
Track title: Riding Sky Waves v001

--

Chapters
00:00 What Is Difference Between Xargs With Braces And Without In Linux?
00:13 Answer 1 Score 4
00:31 Accepted Answer Score 34
01:11 Answer 3 Score 6
01:42 Thank you

--

Full question
https://superuser.com/questions/526352/w...

--

Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...

--

Tags
#linux #centos #xargs

#avk47



ACCEPTED ANSWER

Score 34


xargs rm will invoke rm with all arguments as parameter departed with spaces.

xargs -i{} rm {} will invoke rm {} for each of the argument and {} will be replaced by the current argument.

If you have 2 arguments a.txt and b.txt, xargs rm will call this

rm a.txt b.txt

But xargs -i{} rm {} will call

rm a.txt
rm b.txt

This is because -i option implies -L 1 option which mean the command rm will take only 1 line each time. And here each line contains only 1 argument.

Check this Ideone link to get more idea about it.




ANSWER 2

Score 6


-i option (equivalent to --replace) creates a sort of placeholder where xargs stores the input it just received. In your second command, the placeholder is {}, it works like find -exec option. Once defined, xargs will replace this placeholder with the entire line of input. If you don’t like the {} name, you can define your own:

ls | xargs  -iPLACEHOLDER echo PLACEHOLDER

In your case, both commands are producing the same result. In the second form, you are just making explicit the default behaviour with the -I option.




ANSWER 3

Score 4


With braces it will spawn one rm process per file. Without the braces, xargs will pass as many filenames as possible to each rm command.

Compare

ls | xargs echo

and

ls | xargs -I {} echo {}