哪个批处理文件 dir 命令可以查找名称中带有“。”的所有文件(扩展名不包括“。”)?

哪个批处理文件 dir 命令可以查找名称中带有“。”的所有文件(扩展名不包括“。”)?

我正在尝试创建 %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 是有限制的。

相关内容