Batch file 从DOS命令中移动除部分(文件模式)以外的所有文件

Batch file 从DOS命令中移动除部分(文件模式)以外的所有文件,batch-file,dos,Batch File,Dos,我想从DOS命令中移动所有与文件名模式不匹配的文件。 大概是这样的: 例如,我想移动所有不以“aaa”开头的文件 一种方法是创建要在临时文件中移动的文件列表。然后将中的文件与for命令一起使用。使用findstr生成列表 > dir/b/a-d | findstr /v aaa* > "%temp%\@movelist" > for /f %f in (%temp%\@movelist) do move %f ... 第一个命令获取当前目录中所有文件(没有目录)的列表,然后将

我想从DOS命令中移动所有与文件名模式不匹配的文件。 大概是这样的:

例如,我想移动所有不以“aaa”开头的文件


一种方法是创建要在临时文件中移动的文件列表。然后将中的文件与
for
命令一起使用。使用
findstr
生成列表

> dir/b/a-d | findstr /v aaa* > "%temp%\@movelist"
> for /f %f in (%temp%\@movelist) do move %f ...
第一个命令获取当前目录中所有文件(没有目录)的列表,然后将该列表通过管道传输到
findstr
,其中排除与模式匹配的(
/v
)文件名,并将其放入临时目录中的文件
@movelist
。第二个命令只是获取这些结果,以便您可以对它们执行任何操作(移动它)


也许有一种更好的方法可以在没有临时文件的情况下在单个命令中完成,我只是不知道如何编写它。我不知道如何从
for
命令中调用
dir
命令。AFAIK只接受存在的程序文件,不接受内置命令。

XCOPY设计用于“排除”列表。。。见下文:

   dir /b /a-d "source"|findstr /b "aaa" >"%temp%\aaafiles.tmp"

   xcopy "source" "destination\" /exclude:%temp%\aaafiles.tmp /y
第一行执行源文件夹的目录列表,以裸格式(/b)列出文件,忽略目录名(/a-d)。输出通过管道传输到FINDSTR命令

FINDSTR查看每个文件名,并将其开头(/b)与字符串“aaa”进行比较

如果文件名的开头与字符串“aaa”匹配,则该文件名将重定向(写入)到用户TEMP目录中的文件aaafiles.tmp

/b非常重要,因为您不想排除aafile.txt等文件

XCOPY命令将文件从源文件夹复制到目标文件夹,aaafiles.tmp中列出的文件除外

覆盖现有文件(/y)的提示已关闭


源和目标将需要替换为您自己的文件夹名。

如果您不介意摆弄归档位,您可以使用它根据文件掩码有选择地复制和删除文件

将除以w/“aaa”开头的文件以外的所有文件从当前目录移动(复制和删除)到“dest”。也可以指定完整的源路径

attrib +a *.*
attrib -a aaa*.*
xcopy /a [or /m] *.* dest
del /aa /q *.*  

在某些情况下,它可以变得更简单。例如,我必须递归复制一组目录,但不包括所有图像(png和bmp文件),因此我只创建了一个
excludeList.txt
文件,其中包含:

.png
.bmp

 xcopy /S /I <source> <dest> /exclude:c:\excludeList.txt 
xcopy/S/I/exclude:c:\excludeList.txt
它将匹配包含
.png
的任何文件或目录,但不一定以
.png
结尾。(我没有调查是否可以明智地使用通配符或正则表达式)。
它没有处理您的特定示例(您已经有了一个很好的答案),但它解决了我的问题,我在谷歌搜索解决方案时发现了这个页面:)

Robocopy是一种可能

robocopy source destination *.* /mov /XF aaa*.*

有关选项,请参见此处

不理想,但将所有文件移动到目标位置并将文件移回源位置是实际移动操作(无副本)的快速方法。当然,这假定目标中没有与通配符匹配的文件


move source\*.*destination\&move destination\aaa*.*source\

这是一个文件副本,而不是移动。对于大文件,拷贝速度可能非常慢,而在同一卷上移动几乎是瞬时的。注意:我发现选项
/S
(递归显示目录内容)也很有用。
robocopy source destination *.* /mov /XF aaa*.*