扁平化目录结构

Mor*_*ive 18 windows-7

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

Root Folder
    -- Folder 1
    -- Folder 2
    -- Folder 3
    -- Folder 4
Run Code Online (Sandbox Code Playgroud)

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

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

trl*_*kly 23

没有理由使用特殊工具甚至脚本。只需使用资源管理器中的搜索功能即可。

  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"
Run Code Online (Sandbox Code Playgroud)

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


Mat*_*hew 17

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

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

在此处输入图片说明

  • 请注意,要使其工作,您需要在相应的本地化翻译中键入“文件夹”(例如,意大利语为“System.Kind:&lt;&gt;cartella”) (2认同)
  • 这是一个非常优雅的解决方案。谢谢。 (2认同)

Nic*_*ton 0

使用 Unix shell 可以轻松完成这种事情。以下是您可以使用我自己的Hamilton C shell(包括免费版本)执行的操作。您可以使用Cygwin bash 执行非常类似的操作。

mv *\* .
Run Code Online (Sandbox Code Playgroud)

如果您的目录确实很大,则可能会在命令行中使用通配符太长,导致 Windows 无法传递给子进程。(Windows CreateProcess调用将参数列表限制为 32K Unicode 字符。)但 C shell 内部没有限制,因此您可以通过以下方式迭代整个列表:

foreach i ( *\* )
   mv $i .
end
Run Code Online (Sandbox Code Playgroud)

对于@MarkAllen 的上述观点,这种假设没有重复的名称。如果有,列表中较晚的副本将覆盖较旧的副本。如果这是一个问题,您可以迭代这些文件,mv仅在不覆盖的情况下才对它们进行处理。该:t运算符是尾运算符。运算-e符是文件存在 test

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

这仍然留下空目录,在它们被清空后你可能不想要它们。如果重要的话,这可能是下一次迭代。

  • 有些人对 UNIX 主义如此执着……如果你真的想在 Windows 7 中编写脚本,有 PowerShell,你不需要像 Cygwin 这样的假 bash 模拟器。 (4认同)

归档时间:

查看次数:

30009 次

最近记录:

4 年,6 月 前