{"record":{"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/ee20f426ddf338ac7ead5c5f00ea49258005caaf/src/walk.rs#L321-L357","documentation":"build_overrides (walk.rs:330) feeds each --exclude pattern into ignore::OverrideBuilder::add; if a pattern is syntactically invalid as a glob it returns Err, which fd wraps at walk.rs:339 as 'Malformed exclude pattern'. This is per-pattern: the first bad glob aborts with its underlying message.","triggerScenarios":"Passing `fd --exclude '[abc'` (unterminated class), `fd --exclude 'a{b,c'` (unbalanced brace), or any glob the ignore crate's parser rejects.","commonSituations":"Typos in glob patterns; using regex syntax where glob is expected; copy-pasting patterns from tools with different glob dialects.","solutions":["Correct the glob: balance brackets/braces, e.g. `fd --exclude '[abc]'`.","Remember --exclude uses gitignore/glob syntax, not regex.","Test the glob with `fd --exclude '<pattern>' --max-depth 0 .` in a scratch dir to iterate quickly."],"exampleFix":"# before\nfd --exclude '[abc' .\n\n# after\nfd --exclude '[abc]' .","handlingStrategy":"validation","validationCode":"validate_glob() {\n  # reject unterminated classes/braces cheaply\n  case \"$1\" in\n    *'['*[*]*) : ;;\n  esac\n  # best effort: rely on a glob-aware tool, or just try fd with --max-depth 0\n  fd --exclude \"$1\" --max-depth 0 . >/dev/null 2>&1 || echo \"bad glob: $1\" >&2\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Balance brackets and braces in glob patterns.","Remember --exclude uses glob/gitignore syntax, not regex.","Test excludes against a small scratch tree before deploying."],"tags":["exclude","glob","parsing","cli","walk"],"backgroundTag":null,"analyzedSha":"ee20f426ddf338ac7ead5c5f00ea49258005caaf","analyzedAt":"2026-08-09T08:21:40.573Z","contentChangedAt":"2026-08-09T08:21:40.573Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}