Piping find -name to xargs results in filenames with spaces not being passed to the command

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.


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