Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

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

share|improve this question

migrated from stackoverflow.com Feb 9 '12 at 7:15

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

5 Answers 5

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
    
@Useless: It does, but other versions of find don't, so if you want portability, you should include a directory argument. –  Sven Marnach Feb 8 '12 at 12:35
2  
@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

This should do the job:

$ find <directory> -type f -size -1M -delete
share|improve this answer

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

Try

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

share|improve this answer

You can checkout this link http://ayaz.wordpress.com/2008/02/05/bash-quickly-deleting-empty-files-in-a-directory/ , it has exactly what you want.

for file in *;
  do
    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";
    fi;
done

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
1  
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

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.