Rsync parity: advanced file selection (--filter, --files-from, --cvs-exclude, --prune-empty-dirs, --relative) #129

Closed
opened 2026-07-21 16:24:04 +02:00 by TapTap · 0 comments
Owner

FastSync supports --exclude, --include, --max-size, --min-size. Rsync offers more powerful filtering:

Missing flags

  • -f, --filter <RULE> — add file-filtering rule (merge-file, dir-merge, exclude, include)
  • -C, --cvs-exclude — auto-ignore CVS conventions (.o, .obj, ~, etc.)
  • -F — shorthand for --filter='dir-merge /.rsync-filter'
  • --files-from <FILE> — read source file list from file (finding 7)
  • --from0, -0 — null-terminated filenames
  • --no-implied-dirs — don't send implied dirs with --relative
  • --prune-empty-dirs — prune empty directory chains
  • -R, --relative — use relative path names
  • -d, --dirs — transfer dirs without recursing

Current code

  • scanner.c — BFS traversal with exclude/include patterns
  • config.h — exclude_patterns/include_patterns arrays
  • client_cli.c:110-127 — inline patterns only

Impact

  • --filter enables rsync-compatible advanced filtering (e.g. --filter=':- .gitignore')
  • --files-from enables targeted file selection
  • --cvs-exclude is a common developer convenience
  • --prune-empty-dirs avoids unnecessary directory creation
  • --relative enables partial-path preservation

Implementation notes

  • --filter: complex DSL, start with common rules (exclude, include, dir-merge)
  • --files-from: read file line-by-line, each line is a path
  • --prune-empty-dirs: remove empty dirs after scanning
FastSync supports `--exclude`, `--include`, `--max-size`, `--min-size`. Rsync offers more powerful filtering: ## Missing flags - `-f, --filter <RULE>` — add file-filtering rule (merge-file, dir-merge, exclude, include) - `-C, --cvs-exclude` — auto-ignore CVS conventions (.o, .obj, ~, etc.) - `-F` — shorthand for --filter='dir-merge /.rsync-filter' - `--files-from <FILE>` — read source file list from file (finding 7) - `--from0, -0` — null-terminated filenames - `--no-implied-dirs` — don't send implied dirs with --relative - `--prune-empty-dirs` — prune empty directory chains - `-R, --relative` — use relative path names - `-d, --dirs` — transfer dirs without recursing ## Current code - `scanner.c` — BFS traversal with exclude/include patterns - `config.h` — exclude_patterns/include_patterns arrays - `client_cli.c:110-127` — inline patterns only ## Impact - `--filter` enables rsync-compatible advanced filtering (e.g. --filter=':- .gitignore') - `--files-from` enables targeted file selection - `--cvs-exclude` is a common developer convenience - `--prune-empty-dirs` avoids unnecessary directory creation - `--relative` enables partial-path preservation ## Implementation notes - `--filter`: complex DSL, start with common rules (exclude, include, dir-merge) - `--files-from`: read file line-by-line, each line is a path - `--prune-empty-dirs`: remove empty dirs after scanning
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: TapTap/FastSync#129