2016-12-29 41 views
0

我必须根据以下层级的文件夹/子文件夹结构组织的数据集,包括文件之外的文件:批量移动随机命名的子文件夹

enter image description here

我想删除所有滋扰子文件夹(移动它的内容是外面在同一层级+删除令人讨厌的文件夹),从而结束了这样的组织的文件: enter image description here

我怎样才能做到这一点,使用批处理文件,从命令提示符下运行在Windows 7中?我已经尝试了一些for%F和%% F的语句,但都没有工作。感谢任何提示。

+1

没有任何提示如何区分滋扰和有用既不文件也没有文件夹这个任务是无法解决的。 – LotPings

+2

您的目标有潜在的主要问题。当您尝试将它们移动到“人物n”级别时,曾祖父文件夹名称可能会发生冲突。如果每个有用的文件夹可能有多个子文件夹,则可能会遇到与文件名相同的问题。 – dbenham

+0

@LotPings对不起,如果我不清楚。我试图在层次结构中指出哪些子文件夹是讨厌的文件夹。这些是位于父级文件夹下的两个子文件夹;和立即包含有用文件的子文件夹。 – z8080

回答

2

我相信以下将实现你的目标当且仅当所有子文件夹和文件名是唯一。如果有重复,那么所有的地狱都会崩溃。

我还没有测试过,所以先备份和/或尝试一次性数据上的代码。

您必须修改第一个PUSHD命令以指向所有“人员n”文件夹所在的根目录。

@echo off 
pushd "yourRootWherePersonFoldersReside" 
for /d %%U in (*) do (
    pushd "%%U" 
    for /f "eol=: delims=" %%A in ('dir /b /ad 2^>nul') do (
    for /d %%B in ("%%A\*") do (
     for /d %%C in ("%%B\*") do (
     md "%%~nxC" 
     for /d %%D in ("%%C\*") do move "%%D\*" "%%~nxC" >nul 2>nul 
    ) 
    ) 
    rd /s /q "%%A" 
) 
    popd 
) 
popd 

FOR循环的第二必须是FOR/F,而不是FOR/d,因为/ d具有迭代循环开始后已添加的文件夹的潜力。 FOR/F会在迭代开始之前缓存DIR命令的全部结果,所以新创建的文件夹可以保证不会发生干扰。

+0

谢谢。这与实现目标非常接近。唯一的问题是,文件被移动到应该实际包含它们的文件夹(我称为“N的有用文件夹x”)的相同级别。像这样:https://snag.gy/HFawxS.jpg – z8080

+0

呵呵,实际上我意识到这些有用的文件夹名称(即时包含文件的名称)实际上在人员中是相同的。但是这不应该是一个问题,因为它们中的每一个都驻留在该人员的文件夹中。 – z8080

+0

不幸的是,我完全无法使用这种脚本语言,因此无法对代码进行可能的微小改变,从而改变了行为。或者如果它更容易,也许你可以在代码中添加一些简短的注释,这样我就可以自己调试它。再次感谢你的帮助! – z8080