How to Count Number of Files and Subdirectories inside a Given Linux Directory?

When working with Linux systems, it's essential to know how to count files and subdirectories within a given directory. Python provides several ways to accomplish this task, from using the os module to leveraging the pathlib library for more modern approaches.

Using os.walk() for Recursive Counting

The os.walk() function recursively traverses directories and provides separate counts for files and subdirectories ?

import os

def count_files_and_dirs(directory):
    file_count = 0
    dir_count = 0
    
    for root, dirs, files in os.walk(directory):
        file_count += len(files)
        dir_count += len(dirs)
    
    return file_count, dir_count

# Example usage
directory = "."  # Current directory
files, directories = count_files_and_dirs(directory)
print(f"Files: {files}")
print(f"Directories: {directories}")
Files: 13
Directories: 5

Using os.listdir() for Non-Recursive Counting

For counting only in the current directory without subdirectories, use os.listdir() with os.path.isfile() and os.path.isdir() ?

import os

def count_current_dir(directory):
    items = os.listdir(directory)
    files = sum(1 for item in items if os.path.isfile(os.path.join(directory, item)))
    dirs = sum(1 for item in items if os.path.isdir(os.path.join(directory, item)))
    
    return files, dirs

# Example usage
directory = "."
files, directories = count_current_dir(directory)
print(f"Files in current directory: {files}")
print(f"Subdirectories in current directory: {directories}")
Files in current directory: 8
Subdirectories in current directory: 2

Using pathlib for Modern Approach

The pathlib module provides a more object-oriented and readable approach for file system operations ?

from pathlib import Path

def count_with_pathlib(directory):
    path = Path(directory)
    
    # Recursive counting
    files = sum(1 for item in path.rglob('*') if item.is_file())
    dirs = sum(1 for item in path.rglob('*') if item.is_dir())
    
    return files, dirs

# Example usage
directory = "."
files, directories = count_with_pathlib(directory)
print(f"Total files (recursive): {files}")
print(f"Total directories (recursive): {directories}")
Total files (recursive): 13
Total directories (recursive): 5

Excluding Hidden Files

To exclude hidden files (those starting with a dot), filter them during the counting process ?

import os

def count_without_hidden(directory):
    file_count = 0
    dir_count = 0
    
    for root, dirs, files in os.walk(directory):
        # Filter out hidden files and directories
        files = [f for f in files if not f.startswith('.')]
        dirs[:] = [d for d in dirs if not d.startswith('.')]
        
        file_count += len(files)
        dir_count += len(dirs)
    
    return file_count, dir_count

# Example usage
directory = "."
files, directories = count_without_hidden(directory)
print(f"Files (excluding hidden): {files}")
print(f"Directories (excluding hidden): {directories}")
Files (excluding hidden): 13
Directories (excluding hidden): 3

Comparison

Method Recursive Modern Syntax Best For
os.walk() Yes No Complex directory traversal
os.listdir() No No Current directory only
pathlib Yes Yes Modern Python projects

Conclusion

Use os.walk() for comprehensive recursive counting with full control. Use pathlib for modern, readable code in Python 3.4+. Choose os.listdir() when you only need counts from the immediate directory.

Updated on: 2026-03-15T17:21:05+05:30

3K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements