import fnmatch from pathlib import Path IGNORE_PATTERNS = [ # Version Control ".git", ".svn", ".hg", ".bzr", # Dependencies "node_modules", "__pycache__", ".venv", "venv", ".env", "env", ".tox", ".nox", ".eggs", "*.egg-info", "site-packages", # Build outputs "dist", "build", ".next", ".nuxt", ".output", ".turbo", "target", "out", # IDE & Editor ".idea", ".vscode", "*.swp", "*.swo", "*~", ".project", ".classpath", ".settings", # OS generated ".DS_Store", "Thumbs.db", "desktop.ini", "*.lnk", # Logs & temp files "*.log", "*.tmp", "*.temp", "*.bak", "*.cache", ".cache", "logs", # Coverage & test artifacts ".coverage", "coverage", ".nyc_output", "htmlcov", ".pytest_cache", ".mypy_cache", ".ruff_cache", ] def _should_ignore(name: str) -> bool: """Check if a file/directory name matches any ignore pattern.""" for pattern in IGNORE_PATTERNS: if fnmatch.fnmatch(name, pattern): return True return False def list_dir(path: str, max_depth: int = 2) -> list[str]: """ List files and directories up to max_depth levels deep. Args: path: The root directory path to list. max_depth: Maximum depth to traverse (default: 2). 1 = only direct children, 2 = children + grandchildren, etc. Returns: A list of absolute paths for files and directories, excluding items matching IGNORE_PATTERNS. """ result: list[str] = [] root_path = Path(path).resolve() if not root_path.is_dir(): return result def _traverse(current_path: Path, current_depth: int) -> None: """Recursively traverse directories up to max_depth.""" if current_depth > max_depth: return try: for item in current_path.iterdir(): if _should_ignore(item.name): continue post_fix = "/" if item.is_dir() else "" result.append(str(item.resolve()) + post_fix) # Recurse into subdirectories if not at max depth if item.is_dir() and current_depth < max_depth: _traverse(item, current_depth + 1) except PermissionError: pass _traverse(root_path, 1) return sorted(result) if __name__ == "__main__": print("\n".join(list_dir("/Users/Henry/Desktop", max_depth=2)))