我正在尝试创建 %dir% 目录和子目录中包含的所有文件的列表,这些文件的文件名中包含“.”(不包括扩展名“.”)。我尝试了以下行:
dir "%dir%\*.*.*" /a-d /b /s /-p
但这会返回所有文件,就好像我刚刚使用了掩码“asterisk.asterisk”。我也尝试过掩码“asterisk.asterisk.???”和“asterisk.?asterisk.asterisk”,但没有成功。
仅使用命令就可以实现吗dir
?
如果答案是否定的,我必须使用 for 循环和/或将输出管道传输到findstr
命令,那么我可能可以自己做这件事,但我想先问一下,以防万一有一些明显的文件掩码或模式技巧,或其他技巧只需一个dir
命令即可实现我的目标。
编辑我不得不在上面一些地方逐字写下“星号”,因为某种原因,该符号没有显示在发布的消息中。
答案1
这批单行命令可以做到这一点:
dir /b | findstr "[^.]*\.[^.]*\.[^.]*"
解释 :
[^.]*
- 零个或多个非点字符\.
- 转义的点字符
有关详细信息,请参阅 查找字符串。
答案2
DIR 可能不会独自完成这一任务
您当然不需要使用循环!!!
您只需要一个文件名列表(您可以从 DIR /b ... >aa 获取),将输出重定向到文件(例如名为 aa 的文件),然后对它们应用正则表达式。
许多程序使用正则表达式并让您测试正则表达式。Notepad++ 可能支持正则表达式并且是免费的。我有时使用 JGSoft editpad pro。
许多有用的程序都使用正则表达式,例如 regex renamer 或 powergrep。regex coach 有助于整理正则表达式。当然,grep 也使用正则表达式。了解正则表达式是件好事!
如果你想从命令行找出正则表达式,那么使用 echo 和 grep 是一个好主意。例如echo abc | grep ab
C:\blahblah>dir /b >a.a
C:\blahblah>type a.a
gfgdfgdf.doc
sdfs.ewerw.txt
C:\blahblah>grep -P "[^.]+\.[^.]+\...." a.a
sdfs.ewerw.txt
C:\blahblah>
这会列出所有符合以下模式的文件名:某个非点字符序列,后跟一个点,再后跟某个非点字符序列。后跟一个点,再后跟三个字符。
你必须获得 grep,我的似乎是从 cygwin 获得的较新的版本
C:\blahblah>grep --version
grep (GNU grep) 3.7
Packaged by Cygwin (3.7-2)
Copyright (C) 2021 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Mike Haertel and others; see
<https://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.
C:\blahblah>
另一个答案提到了 findstr,它可能更适合你,因为它是原生的。但请注意,findstr 不支持 PCRE(perl 兼容正则表达式),因此它的一些正则表达式选项有点受限。例如,PCRE 包括查找\d{3}
匹配 3 个连续数字的支持。或前瞻/后瞻。。(?=1)
因此,如果你对正则表达式感兴趣,findstr 是有限制的。