Sam
Sam

Reputation: 267

Recursively count directories and files with a shell script

I'm trying to write a shell script that will recursively count all the files and sub-directories in a directory and also all the hidden ones. My script can count them however it can't detect hidden files and directories that are in a sub-directory. How can i change it so that it is able to do this? Also i cannot use find, du or ls -R

#!/bin/bash
cd $1
dir=0
hiddendir=0
hiddenfiles=0
x=0
items=( $(ls -A) )
amount=( $(ls -1A | wc -l) )

counter() {
    if [ -d "$i" ]; then
        let dir+=1
        if [[ "$i" == .* ]]; then
            let hiddendir+=1
            let dir-=1
        fi
        search "$i"
    elif [ -f "$i" ]; then
        let files+=1
        if [[ "$i" == .* ]]; then
            let files-=1
            let hiddenfiles+=1
        fi
    fi
}
search() {
    for i in $1/*; do
        counter "$i"
    done
}
while [ $x -lt $amount ]; do
    i=${items[$x]}
    counter "$i"
    let x+=1
done

Upvotes: 0

Views: 1720

Answers (2)

Lynch
Lynch

Reputation: 9474

Consider using this:

find . | wc -l

Upvotes: 0

Hans Klünder
Hans Klünder

Reputation: 2292

#!/bin/bash -e

shopt -s globstar dotglob # now ** lists all entries recursively

cd "$1"

dir=0 files=0 hiddendir=0 hiddenfiles=0

counter() {
   if [ -f "$1" ]; then local typ=files
   elif [ -d "$1" ]; then local typ=dir
   else continue
   fi
   [[ "$(basename "$1")" == .* ]] && local hid=hidden || local hid=""
   ((++$hid$typ))
}

for i in **; do
   counter "$i"
done

echo $dir $files $hiddendir $hiddenfiles

Upvotes: 1

Related Questions