26

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.

49

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.

  • 1
    Can't upvote it twice tough :) since you mentioned ARG_MAX I'll also mention that find . -name "*.txt" -exec rm {} \; would be a "safe shot" – kos Aug 26 '15 at 15:36
  • 3
    Thus sayeth the master: always remember xargs -0. – Joshua Aug 26 '15 at 19:46
  • 1
    Super important point: -print0 must be the last option (or at least after -name "*.txt") otherwise this will hit files no longer limited to *.txt... – Kev Sep 8 '18 at 9:49
1

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

0

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

Source answer on SO.

  • That answer mentions -0 instead of -d (for xargs) for BSD systems. What does Ubuntu use? The accepted answer here uses -0. What is correct? – Peter Mortensen Jul 27 '18 at 14:28

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.