The folder-datetime-fix tool provides powerful pattern-based filtering to control which files and directories are processed. This system uses a three-layer hierarchy:
- Base Mode - Sets default exclusion behavior
- Exclude Patterns - Adds additional exclusions (ADDITIVE to mode)
- Include Patterns - Overrides both mode and exclude patterns
WRONG - Directory excluded, traversal stops:
python -m folder_datetime_fix --include=".vscode/**"
# .vscode directory is excluded, so files inside are never checked!RIGHT - Include directory for traversal:
python -m folder_datetime_fix --include=".vscode"
# .vscode directory is included, files follow default modeBEST - Include directory AND contents:
python -m folder_datetime_fix --include=".vscode,.vscode/**"
# Both directory and all contents are explicitly includedSELECTIVE - Include directory but only specific files:
python -m folder_datetime_fix --include=".vscode,.vscode/*.json"
# Directory is traversed, but only .json files are includedExcludes common system and generated files/folders:
- System files:
thumbs.db,.DS_Store,desktop.ini - Version control:
.git/,.svn/,.hg/ - Python:
__pycache__/,*.pyc,.pytest_cache/ - Node.js:
node_modules/,package-lock.json - IDE:
.vscode/,.idea/,*.swp - Build:
dist/,build/,*.egg-info/
Includes everything by default (no automatic exclusions)
Excludes only system FILES (not directories)
Excludes only system FOLDERS (not files)
| Pattern | Matches | Example |
|---|---|---|
*.txt |
All .txt files | file.txt, doc.txt |
test_* |
Items starting with test_ | test_file.py, test_dir/ |
*_backup |
Items ending with _backup | file_backup, dir_backup/ |
?.txt |
Single char + .txt | a.txt, 1.txt |
| Pattern | Matches | Example |
|---|---|---|
**/*.py |
All .py files recursively | src/main.py, tests/unit/test.py |
**/test_* |
test_* files in any directory | tests/test_file.py, src/test_util.py |
src/** |
Everything under src/ | src/file.py, src/utils/helper.py |
*/ |
All directories (with trailing slash) | src/, tests/ (NOT file.txt) |
Important: Patterns ending with / match ONLY directories:
# Exclude all directories named 'temp'
--exclude="temp/"
# Exclude all directories starting with 'test_'
--exclude="test_*/"
# Include only the .git directory (not .gitignore file)
--include=".git/"Critical Concept: When a directory is excluded, traversal stops there. Files inside won't even be checked!
# Scenario: You want all .vscode configuration files
# WRONG - Won't work:
--include=".vscode/*.json"
# Why: .vscode directory is excluded by default mode, traversal stops
# CORRECT - Include directory first:
--include=".vscode,.vscode/*.json"
# Why: .vscode is included (allows traversal), then .json files are included
# ALSO CORRECT - Include everything:
--include=".vscode"
# Why: Directory and contents follow mode (usually includes .json files)Sets the foundation for what's excluded:
# Default mode excludes system files
python -m folder_datetime_fix
# Excludes: .git/, __pycache__/, node_modules/, etc.
# None mode includes everything
python -m folder_datetime_fix --exclude-mode=none
# Excludes: nothing by defaultAdds MORE exclusions on top of the mode:
# Exclude .bak files IN ADDITION to system files
python -m folder_datetime_fix --exclude="*.bak"
# Excludes: system files (from mode) + *.bak files
# With none mode, only excludes what you specify
python -m folder_datetime_fix --exclude-mode=none --exclude="*.bak"
# Excludes: ONLY *.bak filesOverrides BOTH mode and exclude patterns:
# Include .gitignore even though .git* is normally excluded
python -m folder_datetime_fix --include=".gitignore"
# Include important.bak even though *.bak is excluded
python -m folder_datetime_fix --exclude="*.bak" --include="important.bak"python -m folder_datetime_fix --exclude-mode=none --include="*.py,**/*.py"python -m folder_datetime_fix --exclude="test/,tests/,**/test_*/"Include Hidden Files (Unix)
python -m folder_datetime_fix --include=".*"python -m folder_datetime_fix --include="src/,src/**,docs/,docs/**"python -m folder_datetime_fix --exclude="*.bak,*.backup,*~,*.tmp"python -m folder_datetime_fix --include="node_modules,node_modules/**"The --include-generated (or -ig) flag still works and is equivalent to:
python -m folder_datetime_fix --exclude-mode=noneThis includes all files, even system/generated ones.
- Patterns are case-sensitive on Unix, case-insensitive on Windows
- Path separators: Use forward slashes (/) even on Windows
- Multiple patterns: Separate with commas
- Quoting: Use quotes when patterns contain spaces or special characters
- Order doesn't matter: All patterns are evaluated, includes always win
To understand why files are included/excluded:
- Test with small directories first
- Use --exclude-mode=none to isolate pattern behavior
- Add patterns incrementally to see their effect
- Remember directory traversal - parent must be included
# See what's excluded by default
python -m folder_datetime_fix --dry-run
# Test your exclude pattern
python -m folder_datetime_fix --exclude-mode=none --exclude="your_pattern" --dry-run
# Test your include pattern
python -m folder_datetime_fix --include="your_pattern" --dry-run# Include src and tests, but not test fixtures
python -m folder_datetime_fix \
--include="src/,src/**,tests/,tests/**" \
--exclude="tests/fixtures/,tests/fixtures/**"# Process only markdown and rst files
python -m folder_datetime_fix \
--exclude-mode=none \
--include="*.md,**/*.md,*.rst,**/*.rst"# Exclude various build output directories
python -m folder_datetime_fix \
--exclude="build/,dist/,target/,out/,*.egg-info/"Include Specific Hidden Directories
# Include .github and .vscode but not other hidden directories
python -m folder_datetime_fix \
--include=".github/,.github/**,.vscode/,.vscode/**"Problem: Your include pattern matches files but they're not processed
Solution: Check if the parent directory is excluded
# Wrong:
--include="src/tests/*.py" # If src/ is excluded, won't work
# Right:
--include="src/,src/tests/*.py" # Include parent directoryProblem: More files excluded than expected
Solution: Check your exclusion mode
# Check what mode excludes
python -m folder_datetime_fix --exclude-mode=default --dry-run
# Use none mode for full control
python -m folder_datetime_fix --exclude-mode=none --exclude="only_what_you_want"Problem: Pattern doesn't match expected files
Common Issues:
- Missing recursive marker: Use
**/*.txtnot*.txtfor recursive - Wrong path separator: Use
/not\even on Windows - Case sensitivity: Check your platform's rules
- Directory marker: Use
dir/to match only directories
Problem: Include pattern doesn't override exclude
Solution: Check pattern syntax exactly matches path
# If file path is: ./src/test.bak
--exclude="*.bak" --include="src/test.bak" # Correct
--exclude="*.bak" --include="test.bak" # Wrong - paths don't match- Start simple: Use modes when possible, add patterns as needed
- Test incrementally: Add patterns one at a time
- Document patterns: Comment complex pattern combinations
- Include parent directories: For traversal to work
- Use specific patterns: More specific is better than broad
- Consider maintenance: Simple patterns are easier to understand
# Include everything (no exclusions)
--exclude-mode=none
# Exclude additional patterns
--exclude="pattern1,pattern2"
# Include patterns (override everything)
--include="pattern1,pattern2"
# Legacy compatibility
--include-generated # Same as --exclude-mode=none
# Common combinations
--include=".vscode,.vscode/**" # Directory + contents
--exclude="*.bak" --include="keep.bak" # Exclude with exception
--exclude-mode=none --include="*.py" # Only Python files