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.