从DOS命令中移动除某些文件(文件模式)之外的所有文件

9

我想从DOS命令中移动所有不符合文件名模式的文件。

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

for %i in (*) do if not %i == aaa* move %i .\..
6个回答

14

XCOPY 的设计是基于“排除”列表的... 请参考以下内容:

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

   xcopy "source" "destination\" /exclude:%temp%\aaafiles.tmp /y
第一行执行了一个source文件夹的DIR(目录)列表,以裸格式(/b)列出文件,忽略目录名(/a-d)。输出被导入到FINDSTR命令中。 FINDSTR查看每个文件名,并将其开头(/b)与字符串"aaa"进行比较。
如果文件名的开头与字符串"aaa"匹配,则将该文件名重定向(写入)到用户的TEMP目录下的文件aaafiles.tmp中。 /b非常重要,因为你不想将像theaaafile.txt这样的文件排除在外。 XCOPY命令将文件从source文件夹复制到destination文件夹,但不包括列在aaafiles.tmp中的文件。
提示覆盖现有文件(/y)已关闭。 sourcedestination需要替换为您自己的文件夹名称。

2
这只是一个文件复制,而不是移动。对于大文件,复制可能会非常缓慢,而在同一卷上移动则几乎瞬间完成。 - Adisak
注意:我也发现选项/S(递归显示目录内容)很有用。 - Antonio

7

4

你可以通过创建一个临时文件来列出需要移动的文件列表。然后使用 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命令。据我所知,它只接受存在的程序文件,而不是内置命令。

4
如果你不介意操作存档位,你可以使用它来根据文件掩码有选择地复制和删除文件。
将当前目录中除以“aaa”开头的所有文件移动(复制并删除)到“dest”。也可以指定完整的源路径。
attrib +a *.*
attrib -a aaa*.*
xcopy /a [or /m] *.* dest
del /aa /q *.*  

2

在某些情况下,可以使其更加简单。例如,我需要递归地复制一堆目录,但要排除所有图片(png和bmp文件),因此我只需创建一个包含以下内容的excludeList.txt文件:

.png
.bmp

并运行

 xcopy /S /I <source> <dest> /exclude:c:\excludeList.txt 

它将匹配包含“.png”文件或目录,但不一定以“.png”结尾。(我没有研究通配符或正则表达式的智能使用是否可能)。它无法处理您的特定示例(对于这个问题您已经得到了很好的答案),但它解决了我的问题,这是我在谷歌搜索解决方案时找到的页面 :)。

1

虽然不是最理想的方法,但将所有文件移动到目标位置,然后再将它们移回源位置是一种快速的方式,实际上是进行了移动操作(没有复制)。当然,这假定目标位置中没有与通配符匹配的文件。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接