{"id":"5c6d694adec5627e","repo":"sharkdp/fd","slug":"malformed-exclude-pattern","errorCode":null,"errorMessage":"Malformed exclude pattern: {}","messagePattern":"Malformed exclude pattern: (.+?)","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"src/walk.rs","lineNumber":339,"sourceCode":"\n        Self {\n            patterns,\n            config,\n            quit_flag,\n            interrupt_flag,\n        }\n    }\n\n    fn build_overrides(&self, paths: &[PathBuf]) -> Result<Override> {\n        let first_path = &paths[0];\n        let config = &self.config;\n\n        let mut builder = OverrideBuilder::new(first_path);\n\n        for pattern in &config.exclude_patterns {\n            builder\n                .add(pattern)\n                .map_err(|e| anyhow!(\"Malformed exclude pattern: {}\", e))?;\n        }\n\n        builder\n            .build()\n            .map_err(|_| anyhow!(\"Mismatch in exclude patterns\"))\n    }\n\n    fn build_walker(&self, paths: &[PathBuf]) -> Result<WalkParallel> {\n        let first_path = &paths[0];\n        let config = &self.config;\n        let overrides = self.build_overrides(paths)?;\n\n        let mut builder = WalkBuilder::new(first_path);\n        builder\n            .hidden(config.ignore_hidden)\n            .ignore(config.read_fdignore)\n            .parents(config.read_parent_ignore && (config.read_fdignore || config.read_vcsignore))\n            .git_ignore(config.read_vcsignore)","sourceCodeStart":321,"sourceCodeEnd":357,"githubUrl":"https://github.com/sharkdp/fd/blob/41532d114e2ba565fb5367d606c111b29b96450c/src/walk.rs#L321-L357","documentation":"Thrown by WorkerState::build_overrides in src/walk.rs:339 when OverrideBuilder::add(pattern) returns an error for one of the --exclude patterns. The ignore crate's glob parser rejected the pattern — typically an unbalanced character class, bad '{' brace expansion, or a glob token it cannot compile.","triggerScenarios":"Running 'fd --exclude \"[unclosed\"', 'fd --exclude \"{a,b\"' (unbalanced brace), or any exclude glob the ignore crate won't accept.","commonSituations":"Copy-pasting a regex into --exclude (which wants a glob); typos in brace expansion; nested brackets from gitignore syntax.","solutions":["Balance brackets/braces: 'fd --exclude \"[abc]\"' or 'fd --exclude \"{a,b}\"'.","Remember --exclude takes a glob, not a regex — use '*'/'?' for wildcards.","If you need a regex filter, post-process fd's output instead of using --exclude."],"exampleFix":"// before\nfd --exclude '[unclosed'\n\n// after\nfd --exclude '[abc]'","handlingStrategy":"validation","validationCode":"# rough glob sanity check: balanced [] and {}\nbal() { printf '%s' \"$1\" | awk '{o=gsub(/\\[/,\"[\"); c=gsub(/\\]/,\"]\"); ob=gsub(/\\{/,\"{\"); cb=gsub(/\\}/,\"}\"); exit !(o==c && ob==cb)}'; }\nfor p in \"${EXCLUDES[@]}\"; do bal \"$p\" || { echo \"bad exclude glob: $p\" >&2; exit 1; }; done\nfd \"${EXCLUDES[@]/#/--exclude }\" \"$PAT\"","typeGuard":"use ignore::overrides::OverrideBuilder;\nfn exclude_glob_is_valid(base: &str, pat: &str) -> bool {\n    OverrideBuilder::new(base).add(pat).is_ok()\n}","tryCatchPattern":null,"preventionTips":["Remember --exclude expects a glob, not a regex.","Balance character classes [] and brace groups {} in exclude patterns.","Pre-test exclude globs with the ignore crate if generating them programmatically."],"tags":["exclude","glob","parsing","ignore"],"analyzedSha":"41532d114e2ba565fb5367d606c111b29b96450c","analyzedAt":"2026-08-06T01:39:28.509Z","schemaVersion":2}