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