如何从所有子文件夹中取出文件并将其移动到第一个文件夹

如何从所有子文件夹中取出文件并将其移动到第一个文件夹

我从损坏的硬盘中恢复了大约 3 TB 的数据。问题是所有文件和文件夹都完全杂乱无章,并被放在数千个子文件夹中。

问题

是否有一系列命令可以运行,cmd找到所有文件并将它们移动到第一个文件夹中,并删除空的子文件夹?

如果可以按文件扩展名对找到的文件进行排序,并为每个扩展名放入新文件夹中,那就更好了。我正在使用 Windows 10 电脑。

答案1

批处理脚本解决方案

您可以将包含结构中所有需要复制到父文件夹的文件的父文件夹设置为变量。然后,您可以使用对于/r循环和一些条件如果逻辑和变量替换根据需要执行复制、删除、以及文件扩展名文件夹创建操作。

您可以使用一些条件逻辑来检查要复制的文件是否已存在于目标文件夹中,如果是,则称呼一个子程序并将变量替换传递给它以附加_(dupe)到该文件名,这样它就不会覆盖具有相同文件名的现有文件。

要快速删除父文件夹位置内的空目录,您可以运行Robocopy命令,其中Robocopy <dest> <dest> /S /MOVEdestination参数source都相同且等于完整的父文件夹路径。

批处理脚本

@ECHO OFF

SET "Parent=C:\Momma"
SET "dupCnt=1"

FOR /R "%Parent%" %%C IN (*) DO (
    IF NOT EXIST "%Parent%\%%~XC" MD "%Parent%\%%~XC"
    IF NOT EXIST "%Parent%\%%~XC\%%~NXC" (
        XCOPY /Y /F "%%~C" "%Parent%\%%~XC\" && DEL /Q /F "%%~C"
    ) ELSE (
        CALL :Routine "%Parent%\%%~XC\%%~NXC" "%%~C" "%%~NC" "%%~XC"
        )
    )
Robocopy "%Parent%" "%Parent%" /S /MOVE
GOTO :EOF

:Routine
IF EXIST "%Parent%\%~4\%~3_(dupe%dupCnt%)%~4" (
    SET /A dupCnt=%dupCnt%+1
    CALL :Routine "%~1" "%~2" "%~3" "%~4"
) ELSE ( 
    IF EXIST "%~1" (
        ECHO F | XCOPY /Y /F "%~2" "%Parent%\%~4\%~3_(dupe%dupCnt%)%~4" && DEL /Q /F "%~2"
        SET "dupCnt=1"
        )
)
GOTO :EOF

前后文件夹结构示例

C:\MOMMA
├───Adult-Child
│       Adult-Child.jpg
│       Adult-Child.txt
│       Adult-Child.zzz
│       Baby.txt
├───Baby
│       Adult-Child.txt
│       Baby.jpg
│       Baby.txt
│       Baby.zzz
│       Teen.txt
└───Teen
        Adult-Child.txt
        Baby.txt
        Teen.jpg
        Teen.txt
        Teen.zzz

C:\MOMMA
├───.jpg
│       Adult-Child.jpg
│       Baby.jpg
│       Teen.jpg
├───.txt
│       Adult-Child.txt
│       Adult-Child_(dupe1).txt
│       Adult-Child_(dupe2).txt
│       Baby.txt
│       Baby_(dupe1).txt
│       Baby_(dupe2).txt
│       Teen.txt
│       Teen_(dupe1).txt
└───.zzz
        Adult-Child.zzz
        Baby.zzz
        Teen.zzz

更多资源

  • 支持/R
  • 如果
  • 医学博士
  • 复制
  • 德尔
  • 称呼

  • 批量替换 (FOR /?)

    此外,FOR 变量引用的替换功能也得到了增强。现在您可以使用以下可选语法:

    %~I         - expands %I removing any surrounding quotes (")
    %~nI        - expands %I to a file name only
    %~xI        - expands %I to a file extension only
    
  • 算术表达式 (SET /a)

    对于简单的算术来说,将表达式放在“引号”中是可选的,但对于使用逻辑运算符的任何表达式来说,这都是必需的。

    任何SET /A返回小数结果的计算都将向下舍入为最接近的整数。

    待求值的表达式可以包含以下运算符:

    + Add set /a "_num=_num+5"

答案2

FreeCommander XE是一个免费的实用程序(Windows 资源管理器替代品),它具有“平面视图”功能,可以查看目录和所有子目录中的所有文件。

它还具有非常强大的选择/搜索选项,因此您可以轻松根据扩展名选择文件并移动到您选择的目录。当然,这是手动工作,但您可以控制您正在做的事情。

总体来说是一款很棒的工具,救了我在处理大量文件时,这种情况发生过多次。

答案3

如何将文件从多个子文件夹复制到单个文件夹?

打开命令提示符('cmd.exe')窗口。使用以下命令:

cd /d "d:\vacation snaps\2016"

for /r %d in (*) do copy "%d" "d:\all snaps"

在上述例子,该命令将 'vacation snaps\2016' 文件夹中的所有文件递归复制到 'All Snaps' 文件夹中。

或者,使用 Windows Search。请参阅如何将文件从多个子文件夹复制到单个文件夹?

答案4

不幸的是,我以困难的方式完成了这件事。在等待它完成我的方式时,我发现了这个更好的解决方案。哎呀!

我打开了文件资源管理器窗口并搜索:种类:-文件夹

这给了我一份所有文件(不包括文件夹)的列表。然后我按 Ctrl-A 选择所有文件,然后将它们剪切并粘贴到我需要的位置。

然而,脚本解决方案要好得多。赞!

相关内容