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.
More questions on this objective
- A user starts a new terminal window in a running graphical desktop session, which launches bash as an interactive shell that is NOT a login shell. Which file in the user's home directory does bash read in that case? machine-checked
- In bash, which history expansion re-runs the entire previous command line? machine-checked
- Which bash command prints the literal five characters $USER instead of the current user name? machine-checked
- You want /opt/bin searched for executables, after all the directories already in PATH, in the current bash session and in every command started from it. Which command does that? machine-checked
- There is a passwd manual page in section 1 (the command) and another in section 5 (the /etc/passwd file format). Which command opens the section 5 page? machine-checked
- Select the TWO true statements about shell variables and the environment in bash. machine-checked