将多个子文件夹中的所有文件移动到父文件夹中

将多个子文件夹中的所有文件移动到父文件夹中

我通常会打开父文件夹并进行搜索,*以便选择子文件夹中的所有文件,但在这种情况下,我有超过 1,000,000 个文件需要排序,因此当我尝试通过 GUI 复制这么多文件时,我的资源管理器经常崩溃。我不确定通过命令提示符或批处理文件这样做会有多有效,但我想值得一试。

我需要做的是

|parent
|    |123
|    |    123abc.png
|    |456
|    |    456def.png
|    |789
|    |    789ghi.png

变成

|parent
|    123abc.png
|    456def.png
|    789ghi.png

是的,我的实际文件结构将文件名的前 3 个字符赋予文件夹名称,如果这可以帮助对这些进行排序的话。

答案1

使用支持/R在命令提示符下:

[FOR /R] 从 [drive:]path 开始遍历文件夹树,并对每个匹配的文件执行 DO 语句。

首先创建一个暂存文件夹外部您要从中移动文件的父文件夹。这将避免可能的循环引用。

在你的情况下,命令看起来应该是这样的:

FOR /R "C:\Source Folder" %i IN (*.png) DO MOVE "%i" "C:\Staging Folder"

如果要将其放入批处理文件,请更改%i%%i

注意双引号很重要,不要漏掉任何一个。它们确保正确处理任何包含空格的文件名。

移动完成后,您可以根据需要重命名/移动暂存文件夹。

提示:如果你有足够的硬盘空间和时间,你可能想稳妥行事,复制保存文件而不是移动它们,以防万一出现问题。只需将上述命令更改MOVE为。COPY

答案2

forfiles /s /m *.FILETYPE /c "cmd /c move @file .."应将指定 FILETYPE 的任何文件移动到其父文件夹中

答案3

这是一些示例代码:

:loop
    for /d %%D in (%1\*) do (move "%%D\*" %1\ && rmdir "%%D")
    SHIFT
    set PARAMS=%1
if not %PARAMS%!==! goto loop

使用此版本,您可以将要从中删除子文件夹的文件夹拖到批处理中,它会将所有文件从子文件夹移动到父文件夹中。我将其用于下载的存档文件,这些文件随机有或没有子文件夹。请注意,它是针对单个子文件夹制作的,具体到我的情况。

当您在脚本上一次拖动多个子文件夹时,“Shift”表示移动到下一个参数。

答案4

还可以使用环境变量 %%~dpi,它指的是文件所在的文件夹。然后,您可以删除尾部的反斜杠,这样就可以获取文件的父文件夹。下面就是这样做的。

SetLocal EnableDelayedExpansion   
FOR /R "C:\Source Folder" %%i IN (*.png) DO (       
       Set "CurrFile=%%~i"     
       Set "TMPdp=%%~dpi"   
       Set "ParFldr=!TMPdp:~0,-1!"    
       @Echo MOVE "%%~i" "!ParFldr!" ) & REM Delete echo to move. Run to test.

! 启用动态扩展,可用于 %%~i 以及 ParFldr。因此 %%~i 可以是 !CurrFldr!这实际上是测试时所必需的,因为某些文件将包含 Batch 不喜欢的字符串。不喜欢的意思是它们会导致脚本失败并退出。我只是为了清楚起见将所有 %%A 更改为 %%i。使用 A 还是小写 i 真的没有区别,重要的是始终使用相同的字母,所以我将每个 %%A 都更改为 %%i。

相关内容