The pipeline `find . -name '*.tmp' | xargs rm` fails on file names that contain spaces, because xargs treats each word as a separate argument. Which form handles those names correctly?

LPIC-1 Exam 101-500, objective 103. GNU and Unix commands hard

Draft — not checked yet. This question was written from the published exam objectives and cites the clause it comes from, but nobody has yet read it against that clause and signed for it.

It is kept out of search results and out of mock exams until they have. Read the source below before you take the answer as settled.

The options

Not correct find . -name '*.tmp' | xargs -r rm

Wrong. -r (--no-run-if-empty) just stops xargs from running rm at all when there is no input. It does nothing about separators.

Not correct find . -name '*.tmp' | xargs -n 1 rm

Wrong. -n 1 only limits xargs to one argument per rm invocation. The splitting on whitespace has already happened, so a name with a space still becomes two arguments in two separate calls.

Correct find . -name '*.tmp' -print0 | xargs -0 rm

Correct. -print0 separates the names with a NUL byte and xargs -0 splits on NUL. NUL is the one byte that cannot occur in a file name, so any name survives.

Not correct find . -name '*.tmp' | xargs -p rm

Wrong. -p makes xargs prompt for confirmation before each command. You would see the damage coming, but the arguments are still split on whitespace.

Why

xargs builds command lines from standard input, splitting on whitespace and newlines by default, which breaks on names containing spaces, tabs or quotes. The NUL-separated pair `find -print0 | xargs -0` is the safe idiom. `find . -name '*.tmp' -delete` or `-exec rm {} +` avoid the pipe entirely and are safe for the same reason.

Where this comes from

Cited
LPI exam objective 103.4
What it says
Use xargs to turn standard input into arguments for another command.

Practise this

Reading one question is not practice. The trainer will draw a set from objective 103 and space the ones you get wrong.

Practise LPIC-1 Exam 101-500