【问题标题】:Batch to move files outside of randomly-named subfolders批量将文件移动到随机命名的子文件夹之外
【发布时间】:2016-12-29 21:07:03
【问题描述】:

我有一个数据集,由根据以下分层文件夹/子文件夹结构组织的文件组成:

我想删除所有令人讨厌的子文件夹(将其内容移到同一层级的外部 + 删除讨厌的文件夹),从而最终得到如下组织的文件:

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

【问题讨论】:

  • 没有任何提示如何区分有害和有用的文件和文件夹,这个任务是无法解决的。
  • 您的目标可能存在重大问题。当您尝试将它们移动到“person n”级别时,曾孙文件夹名称可能会发生冲突。如果每个有用的文件夹可能有多个子文件夹,您可能会在文件名方面遇到同样的问题。
  • @LotPings 对不起,如果我不清楚。我尝试在上面的层次结构中指出哪些子文件夹是令人讨厌的。这些是 person 父文件夹下的两个子文件夹;以及立即包含有用文件的子文件夹。
  • @dbenham 你是对的。我忘了提一下,所有这些随机文件和(子)文件夹名称实际上都是唯一的,所以覆盖不是问题。

标签: windows batch-file cmd file-rename


【解决方案1】:

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

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

您必须修改第一个 PUSHD 命令以指向所有“person 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,因为 FOR /D 有可能迭代循环开始后添加的文件夹。 FOR /F 会在迭代开始前缓存 DIR 命令的全部结果,所以保证新创建的文件夹不会干扰。

【讨论】:

  • 谢谢。这非常接近实现目标。唯一的问题是,文件被移动到与实际上应该包含它们的文件夹相同的级别(我称之为“有用的文件夹 x of N”)。像这样:snag.gy/HFawxS.jpg
  • 哦,实际上我意识到这些有用的文件夹名称(即直接包含文件的文件夹名称)实际上在不同人之间是相同的。但这不应该是一个问题,因为他们每个人都驻留在这个人的文件夹中。
  • 不幸的是,我完全不熟悉这种脚本语言,因此无法对您的代码进行可能会改变行为的微不足道的更改。或者,如果它更容易,也许您可​​以在代码中添加一些简短的 cmets,以便我自己调试它。再次感谢您的帮助!
  • @z8080 - MOVE 命令的目标位置是错误的 .(当前目录),而它本应与 MD(生成目录)位于同一位置。全部固定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
  • 2016-03-30
相关资源
最近更新 更多