Normally to remove files with spaces in their filename you would have to run:
$ rm "file name"
but if I want to remove multiple files, e.g.:
$ find . -name "*.txt" | xargs rm
This will not delete files with spaces in them.
You can tell find and xargs to both use null terminators
find . -name "*.txt" -print0 | xargs -0 rm
or (simpler) use the built-in -delete action of find
find . -name "*.txt" -delete
or (thanks @kos)
find . -name "*.txt" -exec rm {} +
either of which should respect the system's ARG_MAX limit without the need for xargs.
The xargs command uses tabs, spaces, and new lines as delimiters by default. You can tell it to only use newline characters ('\n') with the -d option:
find . -name "*.txt" | xargs -d '\n' rm
Incidentally, if you used something other than find, you can use tr to replace the newlines with null bytes.
Eg. the following one liner deletes the 10 last modified files in a directory, even if they have spaces in their names.
ls -tp | grep -v / | head -n 10 | tr "\n" "\0" | xargs -0 rm