Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022 | Azure DevOps Server 2020
Pattern syntax
A pattern is a string or list of newline-delimited strings. File and directory names are compared to patterns to include (or sometimes exclude) them in a task. You can build up complex behavior by stacking multiple patterns. See fnmatch for a full syntax guide.
Match characters
Most characters are used as exact matches. What counts as an "exact" match is platform-dependent: the Windows filesystem is case-insensitive, so the pattern "ABC" would match a file called "abc". On case-sensitive filesystems, that pattern and name wouldn't match.
The following characters have special behavior.
*matches zero or more characters within a file or directory name. See examples.?matches any single character within a file or directory name. See examples.[]matches a set or range of characters within a file or directory name. See examples.**recursive wildcard. For example,/hello/**/*matches all descendants of/hello.
Extended globbing
?(hello|world)- matcheshelloorworldzero times or one time*(hello|world)- zero or more occurrences+(hello|world)- one or more occurrences@(hello|world)- exactly once!(hello|world)- nothelloorworld
Note
Extended globs can't span directory separators. For example, +(hello/world|other) isn't valid.
Comments
Patterns that begin with # are treated as comments.
Exclude patterns
Leading ! changes the meaning of an include pattern to exclude.
You can include a pattern, exclude a subset of it, and then re-include a subset of that:
this is known as an "interleaved" pattern.
Multiple ! flips the meaning. See examples.
You must define an include pattern before an exclude pattern. See examples.
Escaping
Wrapping special characters in [] can be used to escape literal glob characters in a file name. For example the literal file name hello[a-z] can be escaped as hello[[]a-z].
Slash
/ is used as the path separator on Linux and macOS.
Most of the time, Windows agents accept /.
Occasions where the Windows separator (\) must be used are documented.
Examples
- Basic pattern examples
- Asterisk examples
- Question mark examples
- Character set examples
- Recursive wildcard examples
- Exclude pattern examples
- Double exclude examples
- Folder exclude examples
Basic pattern examples
Asterisk examples
Example 1: Given the pattern *Website.sln, and the following files:
ConsoleHost.sln
ContosoWebsite.sln
FabrikamWebsite.sln
Website.sln
The pattern would match:
ContosoWebsite.sln
FabrikamWebsite.sln
Website.sln
Example 2: Given the pattern *Website/*.proj and paths:
ContosoWebsite/index.html
ContosoWebsite/ContosoWebsite.proj
FabrikamWebsite/index.html
FabrikamWebsite/FabrikamWebsite.proj
The pattern would match:
ContosoWebsite/ContosoWebsite.proj
FabrikamWebsite/FabrikamWebsite.proj
Question mark examples
Example 1: Given the pattern log?.log, and the following files:
log1.log
log2.log
log3.log
script.sh
The pattern would match:
log1.log
log2.log
log3.log
Example 2: Given the pattern image.???, and the following files:
image.tiff
image.png
image.ico
The pattern would match:
image.png
image.ico
Character set examples
Example 1: Given the pattern Sample[AC].dat, and the following files:
SampleA.dat
SampleB.dat
SampleC.dat
SampleD.dat
The pattern would match:
SampleA.dat
SampleC.dat
Example 2: Given the pattern Sample[A-C].dat, and the following files:
SampleA.dat
SampleB.dat
SampleC.dat
SampleD.dat
The pattern would match:
SampleA.dat
SampleB.dat
SampleC.dat
Example 3: Given the pattern Sample[A-CEG].dat, and the following files:
SampleA.dat
SampleB.dat
SampleC.dat
SampleD.dat
SampleE.dat
SampleF.dat
SampleG.dat
SampleH.dat
The pattern would match:
SampleA.dat
SampleB.dat
SampleC.dat
SampleE.dat
SampleG.dat
Recursive wildcard examples
Given the pattern **/*.ext, and the following files:
sample1/A.ext
sample1/B.ext
sample2/C.ext
sample2/D.not
The pattern would match:
sample1/A.ext
sample1/B.ext
sample2/C.ext
The following example was generated by Copilot. Copilot is powered by AI, so surprises and mistakes are possible. For more information, see Copilot general use FAQs.
The **/*.ext glob pattern is a powerful recursive pattern used in many file systems and tools (like bash, zsh, Python glob, etc.) to match all files ending in .ext in the current directory and all subdirectories, no matter how deeply nested.
Here are some example paths that would match **/*.ext:
sample1/A.extsample1/B.extsample2/C.extsample2/subdir1/D.extsample2/subdir1/subdir2/E.extsample3/F.extsample3/subdir3/G.extsample3/subdir3/subdir4/H.ext
The ** part means any number of directories (including zero), and *.ext means any file ending in .ext.
Exclude pattern examples
Given the following pattern, and the following files:
*
!*.xml
ConsoleHost.exe
ConsoleHost.pdb
ConsoleHost.xml
Fabrikam.dll
Fabrikam.pdb
Fabrikam.xml
The pattern would match:
ConsoleHost.exe
ConsoleHost.pdb
Fabrikam.dll
Fabrikam.pdb
Double exclude examples
Given the following pattern, and the following files:
*
!*.xml
!!Fabrikam.xml
ConsoleHost.exe
ConsoleHost.pdb
ConsoleHost.xml
Fabrikam.dll
Fabrikam.pdb
Fabrikam.xml
The pattern would match:
ConsoleHost.exe
ConsoleHost.pdb
Fabrikam.dll
Fabrikam.pdb
Fabrikam.xml
Folder exclude examples
Given the following pattern, and the following files:
**
!sample/**
ConsoleHost.exe
ConsoleHost.pdb
ConsoleHost.xml
sample/Fabrikam.dll
sample/Fabrikam.pdb
sample/Fabrikam.xml
The pattern would match:
ConsoleHost.exe
ConsoleHost.pdb
ConsoleHost.xml