3

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

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

除了名为“_Unsorted”的子目录外,有没有办法做到这一点?我知道 xcopy 有一个/exclude选项,所以像

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

几乎可以工作,但我不确定如何在复制原件后删除原件,以得到与move

4

3 回答 3

3

你可以使用robocopy吗?

robocopy from\path to\path *.* /mov /e /xd _Unsorted

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

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

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

于 2013-03-01T19:27:58.730 回答
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命令都用于将文件的路径与 substring 进行匹配\_Unsorted\。在第一个版本中,如果有匹配则find返回,否则返回。该命令仅在 的情况下被调用,这是operator` 的效果。successfailmovefail||

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

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

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

    与前一个选项相比,这是对原始脚本更重要的更改,因为它用循环替换了for /r循环for /f

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

于 2013-03-01T22:36:58.163 回答
0

上面的答案 3 使用 ROBOCOPY 创建了一个(可能是空的)子目录树。

以下需要获取xxcopy

xxcopy c:\filematch d:\dest\ /SGF /RC

从 c: 复制到文件夹 d:\dest

/SGF 递归子目录,但在目标处展平结果。在文件名冲突的情况下,它将 .0001 附加到第一个重复文件名。因此 /SGF 将每个匹配的文件从源驱动器复制到指定的目标文件夹中,无论它占据什么子目录。

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

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

于 2014-04-08T16:46:08.407 回答