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.
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It only takes a minute to sign up.
Sign up to join this communityYou 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
.
ARG_MAX
I'll also mention that find . -name "*.txt" -exec rm {} \;
would be a "safe shot"
-print0
must be the last option (or at least after -name "*.txt"
) otherwise this will hit files no longer limited to *.txt
...
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
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
find -name "*\ *.txt" | xargs rm
work for two word files?