Page 1 of 2
Dir undocumented wildcards
Posted: 22 Jan 2015 14:31
by carlos
Hello. I'm searching, but I cannot found the post where was explained the undocumented wildcards of dir command:
Please someone can provide the link to the post?.
Re: Dir undocumented wildcards
Posted: 22 Jan 2015 14:42
by Squashman
I am not following your redirection examples. What do you mean by that?
I don't know of any other wildcards besides ? and *.
I usually use Google to search the site for me. The builtin forum search is limited.
dir wildcard site:dostips.com
Re: Dir undocumented wildcards
Posted: 22 Jan 2015 14:47
by dbenham
I had completely forgotten about those beasts, and I no longer remember any of the details on how they work.
I know I have seen a discussion about them. But I can't remember if it was on this site, or if I participated.
A quick test though shows that they are generally available for use with commands that accept wildcards, not just the DIR command.
@Squashman - try DIR "<", DIR "<<<<<<<<<", DIR ">", DIR ">>>>>" etc. You will be surprised
Dave Benham
Re: Dir undocumented wildcards
Posted: 22 Jan 2015 15:13
by npocmaka_
Re: Dir undocumented wildcards
Posted: 22 Jan 2015 15:22
by Squashman
Ah yes. Now I remember that thread. Not sure why my Google Foo could not find it.
Re: Dir undocumented wildcards
Posted: 22 Jan 2015 15:37
by carlos
@npocmaka: yes, that is. thanks.
I will read it. I have this info, that after read it I will merge.
Code: Select all
The following wildcard characters can be used in the pattern string.
Wildcard character Meaning
* (asterisk)
Matches zero or more characters
? (question mark)
Matches a single character
"
Matches either a period or zero characters beyond the name string
>
Matches any single character or, upon encountering a period or end of name string, advances the expression to the end of the set of contiguous >
<
Matches zero or more characters until encountering and matching the final . in the name
For example I found that you can found files without extension with this:
files in the dir:
find files without extension of 1 length:
find files without extension of greather or equal to 1 length:
Re: Dir undocumented wildcards
Posted: 22 Jan 2015 17:32
by dbenham
@carlos - those rules are not quite right.
@npocmaka - I don't see how you resurrected that thread, unless you had it bookmarked. I had it bookmarked, but I forgot to look. But even if I had, I don't think I would have recognized the title as being relevent.
The rules I had posted in that thread are close, but still not quite complete.
EDIT - I thought I had discovered some better rules, but I was mistaken.Below are some interesting test cases:
Code: Select all
| | GREEDY NATURE
file | "??.??.??" | ">>.>>.>>" | "?a?.??.??" | ">a>.??.??"
----------------+------------+------------+-------------+-------------
a | match | no match | no match | no match
ab | match | no match | no match | no match
abc | no match | no match | no match | no match
a.1 | match | no match | no match | no match
ab.12 | match | no match | no match | no match
abc.123 | no match | no match | no match | no match
a.1.x | match | match | no match | no match
ab.12.xy | match | match | no match | no match
abc.123.xyz | no match | no match | no match | no match
a.1.x.7 | no match | no match | no match | no match
ab.12.xy.78 | no match | no match | no match | no match
abc.123.xyz.789 | no match | no match | no match | no match
| NON-GREEDY
file | "*.*.*" | "*." | "**." | "abc.*." | "*a*"
----------------+----------+----------+-------+----------+-----------
abc | match | match | match | match | match
abc.123 | match | no match | match | match | match
abc.123.xyz | match | no match | match | match | match
abc.123.xyz.789 | match | no match | match | match | match
| NON-GREEDY
file | "<.<.<" | "<" | "<<" | "abc.<" | "<a<" | "<a<<"
----------------+----------+----------+-------+----------+----------+--------
abc | no match | match | match | no match | match | match
abc.123 | no match | no match | match | match | no match | match
abc.123.xyz | match | no match | match | no match | no match | match
abc.123.xyz.789 | match | no match | match | no match | no match | match
=========================================================
The other fascinating (and scary) discovery that jeb made was that < and > wildcards may be used in command names when executing an external command! "<st.bat" can successfully execute "test.bat".
Re: Dir undocumented wildcards
Posted: 23 Jan 2015 09:26
by npocmaka_
dbenham wrote:@carlos - those rules are not quite right.
@npocmaka - I don't see how you resurrected that thread, unless you had it bookmarked. I had it bookmarked, but I forgot to look. But even if I had, I don't think I would have recognized the title as being relevent.
I remember that this started from SO question and checked my favorites there
I've tested some commands that accepts wildcards to see which one will work with ">" and "<" (some commands not listed here
http://ss64.com/nt/syntax-wildcards.html - I've marked them with an asterisk )
ACCEPT <>:
dir
if exist
cacls
type
move
del
cipher*
findstr* (output sets filename: before each line if the string is found)
DOES NOT ACCEPT <>:
Code: Select all
ftp
robocopy
where
forfiles
extrac32
expand
icacls*
more*
takeown*
find* (each filename that match the pattern in is printed like [color=#BF0000]---------- filename[/color] )
replace*
and some other commands:
XCOPY - every time when ">" or "<" is passed it searches for *.* files but is unable to copy them
PRINT - I have no printer (tries with virtual pdf printer but it didnt work) so I couldn't test this.How can I set PRN device?
Re: Dir undocumented wildcards
Posted: 23 Jan 2015 16:00
by dbenham
These are the final set of rules. No cases have been found to refute these rules as of 2016-11-05OK, I think I finally understand the wildcard rules. The issue that was throwing me was the damn short 8.3 names.
One has to remember that the mask is always tested against the full long name, as well as the 8.3 short name (if it exists).The only way I could derive the rules was to work on a drive that had short 8.3 names disabled. The same rules apply to short names, it is just difficult to work them out.
Wildcards can only be used on the final leaf node (file or folder) of a path. Wildcards cannot be used in any of the parent folders of a path.
Non-Wildcard character rules- Each non-wildcard character in a mask must generally match itself, with the following exceptions:
- " (double quote) is totally ignored, except for the fact that it toggles quote semantics on/off. When on, poison characters and token delimiters should not be escaped. When off, then poison characters and token delimiters must be escaped.
- Any combination of trailing . and {space} at end of mask can match the end of name (nothing).
- Any . not at end of the mask can match the end of name (nothing), as long as it is immediately followed by * or ?.
Wildcard character rules- * generally matches any 0 or more characters, with one exception (see next rule). The non-greedy wild card is free to match as many or as few characters as are necessary for the remainder of the mask to match.
- *. at end of mask matches any 0 or more characters except for ..
In actuality, the rule applies with any number of . and {space} characters between the * and terminal ..
- < Matches any 0 or more characters in either the base name or the extension, but never both. A single < cannot match characters in both the base name and the extension. The . is considered to be part of the base name, not the extension. This non-greedy wild card is free to match as many or as few characters as are necessary for the remainder of the mask to match.
- ? Matches any 0 or more characters, except for .. This wildcard is greedy. The only time it matches 0 characters is when it matches the end of the name, or the position before a ..
- > Is identical to ?. The only difference is that it can be placed after a . to prevent the . from matching the end of the name.
Dave Benham
Re: Dir undocumented wildcards
Posted: 24 Jan 2015 08:01
by penpen
dbenham wrote:Any combination of trailing {dot} and {space} at end of mask can match the end of name (nothing).
When using dots with "."/".." directories you only could add one unneeded dot:
Code: Select all
Z:\test>dir "..."
Datenträger in Laufwerk Z: ist Test
Volumeseriennummer: 0438-EEA7
Verzeichnis von Z:\test\..
24.01.2015 14:17 <DIR> .
24.01.2015 14:17 <DIR> ..
24.01.2015 14:17 3 .c
1 Datei(en) 3 Bytes
2 Verzeichnis(se), 133.076.926.464 Bytes frei
Z:\test>dir ....
Datenträger in Laufwerk Z: ist Test
Volumeseriennummer: 0438-EEA7
Verzeichnis von Z:\test\...
Datei nicht gefunden
When using them on default directories it seems that the last dot is removed and one additional dot is allowed:
Code: Select all
Z:\>dir "test."
Datenträger in Laufwerk Z: ist Test
Volumeseriennummer: 0438-EEA7
Verzeichnis von Z:\test
24.01.2015 14:48 <DIR> .
24.01.2015 14:48 <DIR> ..
0 Datei(en) 0 Bytes
2 Verzeichnis(se), 133.074.714.624 Bytes frei
Z:\>dir "test.."
Datenträger in Laufwerk Z: ist Test
Volumeseriennummer: 0438-EEA7
Verzeichnis von Z:\test.
24.01.2015 14:48 <DIR> .
24.01.2015 14:48 <DIR> ..
0 Datei(en) 0 Bytes
2 Verzeichnis(se), 133.074.714.624 Bytes frei
Z:\>dir "test..."
Datenträger in Laufwerk Z: ist Test
Volumeseriennummer: 0438-EEA7
Verzeichnis von Z:\test..
Datei nicht gefunden
Only when listing files it seems any number of dots (complete mask <= 256 characters) are allowed:
Code: Select all
Z:\>dir "test.bat............................................................."
Datenträger in Laufwerk Z: ist Test
Volumeseriennummer: 0438-EEA7
Verzeichnis von Z:\
22.01.2015 14:24 405 test.bat
1 Datei(en) 405 Bytes
0 Verzeichnis(se), 133.074.714.624 Bytes frei
dbenham wrote:A single < cannot match characters in both the base name and the extension. The {dot} is considered to be part of the base name, not the extension.
No, the dot seems to be part of the extension:
Code: Select all
Z:\>>".c" echo c
Z:\>dir "<"
Datenträger in Laufwerk Z: ist Test
Volumeseriennummer: 0438-EEA7
Verzeichnis von Z:\
24.01.2015 14:17 <DIR> .
24.01.2015 14:17 <DIR> ..
24.01.2015 14:17 3 .c
1 Datei(en) 3 Bytes
2 Verzeichnis(se), 133.076.926.464 Bytes frei
Note: All tested on WinXp home 32bit SP3.
penpen
Re: Dir undocumented wildcards
Posted: 24 Jan 2015 10:13
by dbenham
@penpen
Note: All my tests are on Win 7.
1) Trailing {dot} / {space} issueYour examples are comparing apples to oranges.
Yes, the number of allowed trailing dots is limited when specifying the path where the DIR scan is to take place. Also, wildcards are not allowed within the path specification.
But my rule is intended for the actual scan where wildcards are allowed.
Any number of trailing dots and spaces are allowed at the end of a folder name during the scan process
Code: Select all
C:\test2>md test
C:\test2>dir /b /ad "tes?.. .. . ."
test
2) With regard to "<" wildcard, does extension dot belong to base name or extension?Very interesting find - it appears that a file/folder name consisting of an extension without a base name is a special case.
Code: Select all
C:\test2>copy nul b.x
1 file(s) copied.
C:\test2>copy nul .x
1 file(s) copied.
C:\test2>copy nul .b.x
1 file(s) copied.
C:\test2>dir /b /a-d
.b.x
.x
b.x
C:\test2>dir /b /a-d "<"
.x
C:\test2>dir /b /a-d "<x"
.b.x
.x
b.x
C:\test2>dir /b /a-d "b<"
File Not Found
C:\test2>dir /b /a-d "<<"
.b.x
.x
b.x
C:\test2>dir /b /a-d "<b<"
File Not Found
So my rule still stands, with one exception:
A single < cannot match characters in both the base name and the extension. The {dot} is considered to be part of the base name, not the extension. There is one exception: If the name consists solely of an extension, without a base name, then the {dot} is considered to be part of the extension. WRONG - As penpen shows later on, it matches due to the short 8.3 name that does not have an extensionNote that this rule is counter to the normal definition of the extension. For example, the FOR command expansion modifiers always consider the dot to be part of the extension:
Code: Select all
C:\test2>for %F in (b.x) do @echo baseName="%~nF" extension="%~xF"
baseName="b" extension=".x"
C:\test2>for %F in (.x) do @echo baseName="%~nF" extension="%~xF"
baseName="" extension=".x"
C:\test2>for %F in (.b.x) do @echo baseName="%~nF" extension="%~xF"
baseName=".b" extension=".x"
Dave Benham
Re: Dir undocumented wildcards
Posted: 24 Jan 2015 23:35
by Liviu
dbenham wrote:There is one exception: If the name consists solely of an extension, without a base name (...)
Just to nitpick, since it's pretty obvious what you meant in the context, but there is no such thing as a pathname that
"consists solely of an extension, without a base name". Technically, a file ".x" has name ".x" and no extension. For example, "dir /x .x" will show a made-up SFN name and an empty SFN extension.
From the horse's mouth:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx-
"All file systems follow the same general naming conventions for an individual file: a base file name and an optional extension, separated by a period" - which implies that the name is mandatory, the extension optional.
-
"However, it is acceptable to specify a period as the first character of a name. For example, ".temp"." - which implies that ".temp" is the name.
That said, names like ".temp" are uncommon in Windows, and have always been confusing even to Microsoft's own. For example, one of the well respected MSDN blogs offers the following, which directly contradicts the formal spec:
http://blogs.msdn.com/b/oldnewthing/archive/2008/04/14/8389268.aspx -
"Such files are considered to have an extension but no name."And, of course, how any particular program parses ".x" is left to the respective programmers' imagination.
Liviu
Re: Dir undocumented wildcards
Posted: 25 Jan 2015 00:26
by dbenham
Liviu wrote:dbenham wrote:There is one exception: If the name consists solely of an extension, without a base name (...)
Just to nitpick, since it's pretty obvious what you meant in the context, but there is no such thing as a pathname that
"consists solely of an extension, without a base name". Technically, a file ".x" has name ".x" and no extension. For example, "dir /x .x" will show a made-up SFN name and an empty SFN extension.
From the horse's mouth:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx-
"All file systems follow the same general naming conventions for an individual file: a base file name and an optional extension, separated by a period" - which implies that the name is mandatory, the extension optional.
-
"However, it is acceptable to specify a period as the first character of a name. For example, ".temp"." - which implies that ".temp" is the name.
That would explain why "<" matches ".x" - The designers of the "<" treat the entire name as a base name, with no extension. So no exception is needed after all.
Except...
Liviu wrote:That said, names like ".temp" are uncommon in Windows, and have always been confusing even to Microsoft's own. For example, one of the well respected MSDN blogs offers the following, which directly contradicts the formal spec:
http://blogs.msdn.com/b/oldnewthing/archive/2008/04/14/8389268.aspx -
"Such files are considered to have an extension but no name."
The tests that I ran indicate a name like ".bat" is an extension:
Code: Select all
C:\test>echo @echo It's alive!>".bat"
C:\test>.bat
It's alive!
C:\test>for %F in (.bat) do @echo baseName="%~nF" extension="%~xF"
baseName="" extension=".bat"
I think I will keep my rule with the exception as is
Dave Benham
Re: Dir undocumented wildcards
Posted: 25 Jan 2015 00:37
by Liviu
dbenham wrote:The tests that I ran indicate a name like ".bat" is an extension:
You wouldn't be the only one, as I pointed already. However, copy that ".bat" file to a plain FAT drive, then try run it from there - the SFN will have no extension, and will fail to execute. In other words, the low-level FS (file-system) guys followed the spec to the letter, while the high-level cmd/explorer guys played it by the ear. Not so much of a surprise there
Liviu
Re: Dir undocumented wildcards
Posted: 25 Jan 2015 00:47
by dbenham
Liviu wrote:dbenham wrote:The tests that I ran indicate a name like ".bat" is an extension:
You wouldn't be the only one, as I pointed already. However, copy that ".bat" file to a plain FAT drive, then try run it from there - the SFN will have no extension, and will fail to execute. In other words, the low-level FS (file-system) guys followed the spec to the letter, while the high-level cmd/explorer guys played it by the ear. Not so much of a surprise there
Wow
Good to know. Thanks.
Dave Benham