Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

How do I recursively remove files that are less than 1MB in size from a directory?

share|improve this question

migrated from Feb 9 '12 at 7:15

This question came from our site for professional and enthusiast programmers.

This can be done with find:

find . -type f -size -1M -exec rm {} +

Note that this will recursively descend into subdirectories, and will unconditionally delete all files smaller than 1 megabyte. Be careful.

share|improve this answer
you're missing the path argument to find – Useless Feb 8 '12 at 12:25
@Useless: That's GNU find. :) – Sven Marnach Feb 8 '12 at 12:29
I never knew it let you omit that! – Useless Feb 8 '12 at 12:31
@DanielAndersson: find restricts the number of arguments to the called process to fit into the system's limits, in contrast to rm *, which is guranteed to be a single process invocation. find will invoke multiple instance of rm if necessary. And I'm pretty sure that special characters are treated correctly, including newline characters. I prefer -exec rm over -delete for flexibility reasons -- as an example, the latter offers no way to delete write-protected files. – Sven Marnach Feb 13 '12 at 11:57
@Invoker: I reverted your change since it was incorrect. -1M means less than one megabyte as desired. Your version would delete all files with exactly one megabyte in size, which seems to be a somewhat pointless operation. – Sven Marnach Oct 5 '15 at 15:28

This should do the job:

$ find <directory> -type f -size -1M -delete
share|improve this answer
I don't think we need to out hyphen in from of 1M. – Invoker Oct 5 '15 at 14:42
@Invoker, I believe the - sign is a minus sign meaning "less than 1M". If you run find <directory> -type f -size +1M -delete you will delete all files larger than 1M. – chessofnerd Oct 6 '15 at 20:10
yes you are right my bad – Invoker Oct 9 '15 at 22:37

Just for variety and a possible (probably marginal) performance gain:

find <directory> -type f -size -1M -print0  | xargs -0 rm
share|improve this answer
How is this supposed to be faster? It starts an additional xargs process. – Sven Marnach Feb 8 '12 at 12:33
Now you can have two CPUs contending for the same block device! More sensibly, the stat/readdir operations aren't synchronously blocked by the unlink operation. Whether this is likely to be better obviously depends on the subtree size, number of files, device etc. – Useless Feb 8 '12 at 12:36


find . -size -1M -exec rm {} \;

share|improve this answer

You can checkout this link , it has exactly what you want.

for file in *;
    file_size=$(du $file | awk '{print $1}');
    if [ $file_size == 0 ]; then
        echo "Deleting empty file $file with file size $file_size!";
        echo "rm -f $file";

You can iterate through all the files with a for loop and then use du and awk to find the filesize like in the above example.

share|improve this answer
Answers on SO should be self-contained -- don't post a mere link. (Moreover, the code in the linked post deletes empty files rather than files smaller than 1M.) – Sven Marnach Feb 8 '12 at 12:32
@SvenMarnach can't we use $file_size < 1M in the given code example link. – Ravia Feb 8 '12 at 12:36
No, we can't, since the shell won't understand 1M. – Sven Marnach Feb 8 '12 at 12:43
By 1M I meant 1048576 converting 1MB to byte – Ravia Feb 8 '12 at 13:01
Well, if you test if this really works and copy the code to your answer, this might become an SO answer. – Sven Marnach Feb 8 '12 at 13:06

You must log in to answer this question.