#!/usr/bin/env python3 import os import sys def is_binary(file_path): """ Determines if a file is binary by checking its content. Returns True for binary files, False for text files. """ try: with open(file_path, 'rb') as f: # Read the first 1024 bytes to check if it's binary chunk = f.read(1024) if b'\0' in chunk: return True return False except Exception as e: print(f"Error reading file {file_path}: {e}") return True # Treat unreadable files as binary for safety. def count_lines_in_file(file_path): """ Counts the number of lines in a given text file. """ try: with open(file_path, 'r', encoding='utf-8', errors='ignore') as f: return sum(1 for _ in f) except Exception as e: print(f"Error counting lines in file {file_path}: {e}") return 0 def count_lines_in_directory(directory, extensions=None): """ Recursively counts lines in all text files (optionally filtered by extensions) within the directory. """ total_lines = 0 total_files = 0 for root, _, files in os.walk(directory): for file_name in files: file_path = os.path.join(root, file_name) # Skip binary files if is_binary(file_path): continue # Check for extensions if provided if extensions and not file_name.lower().endswith(tuple(extensions)): continue # Count lines in the valid file lines = count_lines_in_file(file_path) total_lines += lines total_files += 1 return total_files, total_lines if __name__ == "__main__": # Get extensions from command-line arguments extensions = [ext.lower() for ext in sys.argv[1:]] if len(sys.argv) > 1 else None # Get the current working directory current_dir = os.getcwd() print(f"Scanning directory: {current_dir}") if extensions: print(f"Filtering by extensions: {', '.join(extensions)}") total_files, total_lines = count_lines_in_directory(current_dir, extensions) print(f"Total matching files: {total_files}") print(f"Total lines across matching files: {total_lines}")