如何将文件从特定子目录移动到目录树的基目录中的子目录?

时间:2017-12-19 07:30:49

标签: windows batch-file cmd

基目录有大约20个子目录。每个子目录都有许多文件。我需要立即将特定子目录中的所有文件移动到基​​目录中新创建的子目录。

例如,我在基目录D:\Documents中有以下目录:

D:\Documents\12345\data\images\
D:\Documents\12345\test\
D:\Documents\12345\documents\

我需要将images下的所有文件移动到新目录中的创建目录D:\Documents\images

你能帮帮我吗?

1 个答案:

答案 0 :(得分:0)

这个小批处理文件可以完成工作:

@echo off
md D:\Documents\images 2>nul
for /F "delims=" %%I in ('dir D:\Documents\* /A-D /B /S 2^>nul ^| %SystemRoot%\System32\findstr.exe /B /I /R /C:D:\\Documents\\..*\\images\\ 2^>nul') do (
    move /Y "%%I" "D:\Documents\images\%%~nxI"
    rd "%%~dpI" 2>nul
)

批处理文件首先创建目标目录,如果此目录已存在,则禁止 MD 输出错误消息。此批处理文件可以预期可以创建此目录并将文件移动到此目录中,而无需任何其他检查。

命令 DIR D:\Documents及其所有子目录中搜索/S因为/A-D(属性不是目录)而只显示文件,并以裸露输出格式是因为/B,这意味着文件名只有文件扩展名,在这种情况下也是/S的完整路径。

DIR 可能无法在整个D:\Documents目录树中找到任何文件。在这种情况下,用于处理 STDERR 的错误消息通过在命令 DIR 后使用2>nul将其重定向到设备 NUL 来抑制。 / p>

DIR 的输出被重定向为用作过滤器的命令 FINDSTR 的输入。它运行一个正则表达式查找搜索以D:\Documents\开头的行,在\images\必须找到之前至少还有一个字符。因此,如果此目录已存在,并且启动批处理文件时存在文件,则忽略目录D:\Documents\images\中的文件。但它不会过滤掉D:\Documents\12345\data\images\Subfolder\中的文件,因为此正则表达式不会检查路径末尾是否找到\images\

FINDSTR 可能找不到与正则表达式匹配的任何行(文件名)。在命令 FINDSTR 之后使用2>nul可以抑制此情况下的错误消息输出。

DIR FINDSTR 的命令行由 FOR 在后台以cmd.exe /C启动的单独命令进程中执行一个可见的窗口。因此,重定向操作符>|必须使用^进行转义,以便在解析整个 FOR 时由Windows命令解释程序首先解释为文字字符。执行 FOR 之前的命令行。

命令行输出的行 DIR FINDSTR 在单独的命令过程中处理 STDOUT FOR <捕获/ strong>然后逐行处理。使用delims=时,通过指定空分隔符列表,可以禁用使用空格和水平制表符作为分隔符将每一行拆分为标记的默认行为。

命令 MOVE 将找到的文件移动到D:\Documents\images\,并覆盖该目录中具有相同名称的文件。

如果此目录在移动文件后为空,则 RD 命令将删除刚移动的文件的目录。否则,在目录尚未为空时,将通过命令 RD 输出错误消息以处理 STDERR ,并再次使用2>nul来抑制

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • dir /?
  • echo /?
  • findstr /?
  • for /?
  • md /?
  • move /?
  • rd /?

另请阅读Microsoft有关Using Command Redirection Operators

的文章