Bash: print each input string in a new line
find . something -print0 | xargs -r0 printf "%s\n"
Clearly, find
can also print one per line happily without help from xargs
, but presumably this is only part of what you're after. The -r
option makes sense; it doesn't run the printf
command if there's nothing to print, which is a useful and sensible extension in GNU xargs
compared with POSIX xargs
which always requires the command to be run at least once. (The -print0
option to find
and the -0
option to xargs
are also GNU extensions compared with POSIX.)
Most frequently these days, you don't need to use xargs
with find
because POSIX find
supports the +
operand in place of the legacy ;
to -exec
, which means you can write:
find . something -exec printf '%s\n' {} +
When the +
is used, find
collects as many arguments as will fit conveniently on a command line and invokes the command with those arguments. In this case, there isn't much point to using printf
(or echo
), but in general, this handles the arguments correctly, one argument per file name, even if the file name contains blanks, tabs, newlines, and other awkward characters.
Here's one way with echo
to get what you want.
find . something -print0 | xargs -r0 -n1 echo
-n1
tells xargs
to consume 1 command line argument with each invocation of the command (in this case, echo
)