批量移动文件时如何排除某些文件?还是使用xcopy命令并在移动后删除原始文件?

3

我有一个脚本,可以从所有子目录中提取所有文件,并在此之后删除空的子目录,提取部分如下:

for /r %%a in (*.*) do move "%%a" "%~dp0"

除了名为“_Unsorted”的子目录外,是否有其他方法可以实现这个?我知道xcopy有一个/exclude选项,因此类似下面的内容:

for /r %%a in (*.*) do xcopy "%%a" "%~dp0" /exclude "\_Unsorted\"

这个方案几乎可以解决问题,但是我不确定如何在复制后删除原始文件,以达到与move相同的效果。

3个回答

3
你会使用robocopy吗?
robocopy from\path to\path *.* /mov /e /xd _Unsorted

/mov: 移动而不是复制(在复制后删除源文件)

/e: 递归(包含空的子目录)

/xd _Unsorted: 排除名为_Unsorted的目录


希望OP使用的Windows版本有 robocopy,尽管无论如何都值得提到这个强大的工具。 - Andriy M

1
一些仅适用于批处理的选项:
  1. 在循环体中添加一个过滤器:

    for /r %%a in (*.*) do (
      (echo %%~dpa | find /i "\_Unsorted\" 1>nul) || move "%%a" "%~dp0"
    )
    

    或者:

    for /r %%a in (*.*) do (
      (echo %%~dpa | find /i /v "\_Unsorted\" 1>nul) && move "%%a" "%~dp0"
    )
    

    两种版本都使用find命令将文件路径与子字符串\_Unsorted\进行匹配。在第一版中,如果匹配成功,则find返回success,否则返回fail。只有在fail的情况下才调用move命令,这是||运算符的作用。

    在第二个版本中,/v开关反转了find的结果,现在success表示没有匹配。因此,&&运算符用于在success的情况下调用move

  2. 将过滤器应用于文件列表,以便循环不会遍历_Unsorted条目。

    for /f "delims=" %%a in (
      'dir /s /b ^| find /i /v "\_Unsorted\"'
    ) do move "%%a" "%~dp0"
    

    这比前一个选项对原始脚本进行了更基本的更改,因为它用for /f循环替换了for /r循环。

    基本上,for /f循环用于读取/解析一段文本、文本文件或命令的输出。在这种情况下,dir命令提供了当前目录树中所有文件的完整列表,而find命令则过滤掉其中路径包含\_Unsorted\的文件。在经过find过滤后,for /f循环读取该列表,这意味着它永远不会遍历存储在_Unsorted(子)文件夹中的文件。


看起来很有前途,但似乎并不起作用。前两个选项仍然从 '_Unsorted' 提取文件,而后一个选项则无法运行。有任何想法吗? - Insarov
它们中所有的都有错误(那种让人摇头的错误)。请现在查看一下。 - Andriy M
它们工作得非常完美,谢谢。这些选项中有哪些本质上比其他选项更好?还是由程序员个人喜好决定?我对此还很新,正在尝试同时学习Python和批处理脚本。 - Insarov
我没有进行过适当的测试。我的个人意见是,#2 可能比 #1 的任何变体都要好。在这两种情况下,过滤几乎是一样的,但是 #2 可以一次性筛选所有项目,这应该比单独测试每个项目要快。而且,因为在循环开始之前已经缩小了项目列表,所以 #2 执行的迭代次数也更少。另一方面,当然,在目录树中迭代文件可能比迭代命令输出的行要更有效率,但我不确定这是否会抵消性能上的差异。 - Andriy M

0
使用ROBOCOPY回答上面的第3个问题,可以创建一个(可能为空的)子目录树。
以下需要获取xxcopy。
xxcopy c:\filematch d:\dest\ /SGF /RC

将 c: 中的文件复制到 d:\dest 文件夹

/SGF 递归子目录,但在目标位置上展开结果。如果文件名冲突,则在第一个重复的文件名后添加 .0001。因此,/SGF 将每个匹配的文件从源驱动器复制到指定的目标文件夹中,无论它位于哪个子目录中。

/RC 在成功复制后从源中删除文件,也就是移动文件。

不确定这是否是 OP 想要的,但这个讨论对我很有帮助!


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