Terminal · intermediate
Building arguments with xargs
xargs reads input records and constructs one or more command invocations whose argument lists contain those records, subject to parsing and size options.
Why it matters
It bridges stream-producing tools and argument-oriented commands while batching work below operating-system argument-size limits.
Mental model
How to reason about building arguments with xargs
Parse input into logical items, accumulate as many as allowed, append them to a command template, run it, and repeat until input is exhausted.
Analogy
It is a dispatcher that packs incoming items into delivery vans, sending several loads when one command line cannot carry everything.
Examples
See the boundary, not just the happy path
Worked example · Null-safe file batching
find logs -type f -print0 | xargs -0 -r gzipfind and xargs agree on null-delimited pathnames, while GNU xargs -r avoids invoking gzip at all when find produces no matches.
Worked example · Place one item in a template
printf '%s\n' alice bob | xargs -n1 -I{} sh -c 'printf "hello %s\n" "$1"' sh {}Each input item becomes $1 in a separate shell invocation; passing data as an argument avoids interpolating it into shell source.
Avoid · Whitespace-delimited filenames
find . -type f -print | xargs rmDefault xargs parsing treats blanks, quotes, and newlines specially, so printed filenames can split or be reinterpreted.
Common mistakes
Misconceptions to remove early
Assuming one input line equals one argument
Default xargs parsing is whitespace-and-quote based; use a matched explicit delimiter such as -0 for arbitrary pathnames.
Injecting input into sh -c source text
Untrusted input interpolated into shell code can become syntax; pass it as positional arguments and quote expansions inside the fixed script.
Quick check
Can you predict the result?
1. Which producer-consumer pair safely preserves arbitrary Unix pathnames?
- • find ... -print0 | xargs -0 ...
- • find ... -print | xargs ...
- • ls | xargs ...
2. Why can xargs invoke a command more than once?
Keep building