Find all zero-byte files in directory and subdirectories

LinuxShell

Linux Problem Overview


How can I find all zero-byte files in a directory and its subdirectories?

I have done this:

#!/bin/bash
lns=`vdir -R *.* $dir| awk '{print $8"\t"$5}'`
temp=""
for file in $lns; do
    if test $file = "0"; then
        printf $temp"\t"$file"\n"
    fi
    temp=$file
done

But, I only get results in the current directory, not subdirs, and if any file name contains a space then I get only first word followed by tab

Linux Solutions


Solution 1 - Linux

To print the names of all files in and below $dir of size 0:

find "$dir" -size 0

Note that not all implementations of find will produce output by default, so you may need to do:

find "$dir" -size 0 -print

Two comments on the final loop in the question:

Rather than iterating over every other word in a string and seeing if the alternate values are zero, you can partially eliminate the issue you're having with whitespace by iterating over lines. eg:

printf '1 f1\n0 f 2\n10 f3\n' | while read size path; do
    test "$size" -eq 0 && echo "$path"; done

Note that this will fail in your case if any of the paths output by ls contain newlines, and this reinforces 2 points: don't parse ls, and have a sane naming policy that doesn't allow whitespace in paths.

Secondly, to output the data from the loop, there is no need to store the output in a variable just to echo it. If you simply let the loop write its output to stdout, you accomplish the same thing but avoid storing it.

Solution 2 - Linux

As addition to the answers above:

If you would like to delete those files

find $dir -size 0 -type f -delete

Solution 3 - Linux

No, you don't have to bother grep.

find $dir -size 0 ! -name "*.xml"

Solution 4 - Linux

Bash 4+ tested - This is the correct way to search for size 0:

find /path/to/dir -size 0 -type f -name "*.xml"

Search for multiple file extensions of size 0:

find /path/to/dir -size 0 -type f \( -iname \*.css -o -iname \*.js \)

Note: If you removed the \( ... \) the results would be all of the files that meet this requirement hence ignoring the size 0.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionCivaView Question on Stackoverflow
Solution 1 - LinuxWilliam PursellView Answer on Stackoverflow
Solution 2 - LinuxLinuxLuigiView Answer on Stackoverflow
Solution 3 - LinuxBatcherView Answer on Stackoverflow
Solution 4 - LinuxMike QView Answer on Stackoverflow