扁平化目录结构

扁平化目录结构

我在文件夹中放了一堆文件夹。像这样

Root Folder
    -- Folder 1
    -- Folder 2
    -- Folder 3
    -- Folder 4

我想折叠所有文件夹,以便文件夹 1、文件夹 2、文件夹 3、... 文件夹 n 下的所有文件都存在于根文件夹下。

在 Windows 中执行此操作的最快方法是什么?

答案1

您可以在 Windows 资源管理器中展平文件夹,方法是导航到要展平的文件夹并搜索以System.Kind:<>folder从结果中排除文件夹。

然后,您可以使用 CTRL+A 选择所有文件,并将其复制并粘贴到新文件夹中。请注意,Windows 资源管理器会询问您如何处理重复的文件名。

在此处输入图片描述

答案2

没有必要使用特殊工具甚至脚本。只需使用 Explorer 中的搜索功能即可。

  1. 在资源管理器中打开您想要展平的文件夹。
  2. 创建一个新文件夹,选择所有文件(但不选择文件夹),然后将它们拖到该文件夹​​中(这将避免获取这些文件的两个副本。)
  3. 在搜索框(地址栏右侧)中输入*并按 Enter。
  4. 列表填充后,右键单击并选择全部,然后右键单击并剪切。
  5. 按返回按钮返回到原始文件夹,然后右键单击并粘贴。
  6. 如果您有任何重复的名称,系统将提示您如何处理。选择最适合您用例的选项。(我认为是复制两个文件。)为了避免再次出现提示,请确保使用底部的复选框将此应用于所有文件。
  7. 选择所有文件夹,通过查看所选文件数量的弹出窗口确保它们是空的,然后删除它们。

如果您希望有一个脚本,这样您就可以启动它并忘记它,也可以这样做。替换命令mv *\* .非常简单(for /r %f in (*.*) do @move "%~f" .),但我确信您想处理重复项,而不像@Nicole Hamilton 的回答那样留下它们。在重复项的文件名后附加一个数字可能是最简单的方法。

将以下批处理文件复制并粘贴到记事本中,并将其保存为“flatten.cmd”(包括引号):

@echo off
cd "%~1"
md tempryfolder
move *.* tempryfolder
for /r %%f in ("*.*") do call :START "%%~f"
for /r /d %%f in (*.*) do rd "%%~f" 
GOTO :EOF
:START
setlocal
If exist "%~n1%~x1" set /a num=2
:LOOP
If exist "%~n1%num%%~x1" (
    set /a num+=1
    goto loop
)
move "%~1" "%~n1%num%%~x1"

要使用该脚本,只需将您想要展平的文件夹拖到其上面即可。

答案3

这种事情在 Unix shell 中很容易做到。以下是你可以用我自己的 shell 做的事情汉密尔顿C壳(包括免费版本)你可以做类似的事情赛格威重击。

mv *\* .

如果您的目录非常大,则可能会出现通配符过长的命令行,Windows 无法将其传递给子进程。(Windows创建进程调用将参数列表限制为 32K Unicode 字符。)但 C shell 内部没有限制,因此您可以通过这种方式遍历整个列表:

foreach i ( *\* )
   mv $i .
end

对于@MarkAllen 上面的观点,这种假设没有重复的名称。如果有,列表中较新的副本将覆盖较旧的副本。如果担心这一点,您可以迭代文件,mv只有在不覆盖的情况下才对它们进行 'ing。:t运算符是尾部运算符.-e操作员是文件存在测试

foreach i ( *\* )
   if ( -e $i:t ) then
      echo -2 $i not moved because it already exists
   else
      mv $i .
   end
end

这仍然会留下空目录,清空后你可能就不想要了。如果这很重要,那可能是下一次迭代。

答案4

相关内容