我正在尝试获取只有具有给定扩展名的文件的目录列表。乍一看,这似乎是一件简单的事情,但请查看这个简单的例子:
C:\CODE\metcal>dir /b *.exe
metcal.exe
metcal.exe1
请注意,这会将metcal.**exe**
和metcal.**exe1**
作为匹配项返回。
使用python文件会发生类似的事情:
C:\CODE\metcal>dir /b *.py
metcal.py
metcal.pyc
再次注意Windows已确定*.py
采用以*.py
开头的任何内容,因此它也会捕获.pyc
个文件。
有没有办法只获得完全匹配的扩展名?在上面的python文件示例中,我希望发生以下情况(显然使用正确的语法替换* .py)
C:\CODE\metcal>dir /b *.py
metcal.py
作为一个注释,Windows下的匹配并不像看起来那么简单。
*.exe
匹配foo.exe, foo.exe1, foo.exeabcde
但不 foo.exe.bak
在SO上还有其他与长/短文件名相关的问题。这里的* .py和* .pyc示例不应该引入名称修改机制。
**我已经在XP和Win7机器上进行了实验,这种行为在cmd提示符和文件打开对话框中不一致。这种不一致的行为让我怀疑这个问题与某些人的设置有关。 **
答案 0 :(得分:0)
因此,如果您只想获得这些扩展程序(.py
和.pyc
),您应该尝试这样:
@echo off
dir /b *.py*
pause
答案 1 :(得分:0)
这是因为扩展名上的Windows通配符会同时检查长名和短名,如以下答案所示: https://superuser.com/questions/238900/winxp-dir-command-3-and-4-char-extensions-are-the-same#238930
解决方案是禁用8.3名称创建,然后将其剥离到ntfs卷上,这也将提高性能。
Microsoft Docs: Fsutil 8dot3name
备注: 永久删除8dot3文件名并且不修改指向8dot3文件名的注册表项可能会导致应用程序意外失败,包括无法卸载应用程序。建议您先备份目录或卷,然后再尝试删除8dot3文件名。
答案 2 :(得分:0)
您可以使用 Windows Subsystem for Linux 中的 Unix ls
命令来执行此操作,假设您已安装 WSL。它可以从 Microsoft 免费获得。在 Windows 命令提示符下,键入 wsl
后跟 ls
命令以列出您想要的文件。
因此,对于您的示例,wsl ls metcal.py
仅返回 metacal.py。要获得与 dir
相同的结果,请使用 wsl ls metcal.py*
。