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

Machine-checked — no person has signed for it. This question was read against the source cited below by an automated pass, which found no contradiction. That is a weaker claim than it sounds: the same kind of process wrote the question, so it can confirm its own mistake.

Treat it as a good draft rather than as settled fact, and read the source below before you rely on it. It is not used in mock exams here — only questions a person has signed for are.

How these questions are written — where each question comes from, what the verification ledger records, and what happens when one is found wrong.

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 short set from objective 103 and space the ones you get wrong.

Practise LPIC-1 Exam 101-500

More questions on this objective

All questions on GNU and Unix commands

Practise LPIC-1 Exam 101-500