当我使用copy *.txt somefolder\
系统时,它似乎*.txt~
也复制了所有文件,这不是我想要的。使用以下命令可以看到类似的效果dir
:
C:\Users\Paul\Documents\Programs\Proffy>dir *.txt
Volume in drive C is Vista
Volume Serial Number is EC23-AD6B
Directory of C:\Users\Paul\Documents\Programs\Proffy
29/11/2008 13:54 35,821 COPYING.txt
31/10/2009 21:54 1,644 INSTRUCTIONS.txt
06/06/2009 15:57 1,393 INSTRUCTIONS.txt~
04/01/2009 11:59 116 Notes.txt
19/04/2009 16:53 134 README.txt
04/01/2009 12:42 132 README.txt~
31/10/2009 21:30 197 TODO.txt
31/10/2009 19:10 414 TODO.txt~
8 File(s) 39,851 bytes
0 Dir(s) 41,938,862,080 bytes free
C:\Users\Paul\Documents\Programs\Proffy>
我如何才能获得dir
并仅对以 和而不是copy
结尾的文件进行操作?.txt
.txt~
答案1
显然,外壳考虑到了短和通配符扩展的长名称。可以在以下位置找到更详细的解释shf301 的回答。这很不幸,可能是 DOS 的旧时代遗留下来的,因为 DOScmd
毕竟是试图兼容的——某种程度上。
这里有几个选项:
使用
forfiles
,其对于通配符扩展具有不同的语义:forfiles /m *.txt /c "cmd /c copy @file foo"
该功能至少在 Vista 及更高版本上可用。
使用
for
并检查扩展:for %a in (*.txt) do @if %~xa==.txt @copy "%i" foo
不幸的是,仅使用通配符扩展
for
也会返回任何带有扩展名的文件.txt~
。这就是为什么我们需要再次检查扩展名。使用
xcopy
. 虽然xcopy
具有与 shell 相同的通配符扩展语义,但您可以为其提供一个要忽略的名称的文件:echo .txt~>tmpfile xcopy *.txt foo /exclude:tmpfile del tmpfile
使用
robocopy
. 虽然robocopy
具有与 shell 相同的通配符扩展语义,但您可以为其提供要忽略的文件/通配符列表:robocopy . foo *.txt /XF *.txt~
使用
for
、dir
和findstr
的适当组合。这实际上只是过滤掉所有以 结尾的行~
,并对其余行进行操作。if
我认为上面的变体更优雅。for /f "usebackq delims=" %i in (`dir /b *.txt ^| findstr /r "[^~]$"`) do @copy "%i" foo
只是为了完整性:PowerShell:
Copy-Item *.txt foo
答案2
我的解决方案是del *.xyz~
先执行copy *.xyz
。虽然不是很出色,但确实有效。
答案3
我不确定如何停止dir
/copy
仅匹配*.txt
,但我可以解释为什么*.txt
会返回它所做的;它匹配所有以 .txt 结尾的短文件名,执行 adir /x *.txt
以查看这一点。这个问题发生在以相同的前三个字符开头的每一组扩展名中(例如*.htm
将匹配 htm、html 甚至 htmlasdfasdf)。
此外,大多数 Windows 应用程序都会这样做,因为操作系统提供的 API 可以搜索文件查找第一个文件匹配长文件名和短文件名。引用:
搜索包括长文件名和短文件名。
您必须按照 Johannes Rössel 的回答建议进行某种自定义过滤。
答案4
现有的答案封面只是复制文件掉了,但没有列出它们。
您可以使用存档位两者兼而有之。尽管它旨在与复制1,它还适用于目录2。
脚步:
确保所有
.txt
文件都设置了存档位:ATTRIB +A *.txt
从所有文件中删除存档位
.txt~
:ATTRIB +A *.txt~
列出所有
.txt
设置了存档位的文件:DIR /AA *.txt
或将其复制到
somefolder
:XCOPY /A *.txt somefolder/
1 XCOPY 使用/A
开关排除所有未设置存档位的文件。这可用于从每日备份中排除某些文件(例如临时文件)。使用此/M
开关,它还会从文件中删除存档位,这在将文件复制到小型存储设备(例如软盘)时非常方便。此外,修改文件会自动设置存档位,因此开关/M
可用于增量备份。
2 DIR /AA
仅显示已设置存档属性的文件。