我在文件夹中放了一堆文件夹。像这样
Root Folder
-- Folder 1
-- Folder 2
-- Folder 3
-- Folder 4
我想折叠所有文件夹,以便文件夹 1、文件夹 2、文件夹 3、... 文件夹 n 下的所有文件都存在于根文件夹下。
在 Windows 中执行此操作的最快方法是什么?
答案1
答案2
没有必要使用特殊工具甚至脚本。只需使用 Explorer 中的搜索功能即可。
- 在资源管理器中打开您想要展平的文件夹。
- 创建一个新文件夹,选择所有文件(但不选择文件夹),然后将它们拖到该文件夹中(这将避免获取这些文件的两个副本。)
- 在搜索框(地址栏右侧)中输入
*
并按 Enter。 - 列表填充后,右键单击并选择全部,然后右键单击并剪切。
- 按返回按钮返回到原始文件夹,然后右键单击并粘贴。
- 如果您有任何重复的名称,系统将提示您如何处理。选择最适合您用例的选项。(我认为是复制两个文件。)为了避免再次出现提示,请确保使用底部的复选框将此应用于所有文件。
- 选择所有文件夹,通过查看所选文件数量的弹出窗口确保它们是空的,然后删除它们。
如果您希望有一个脚本,这样您就可以启动它并忘记它,也可以这样做。替换命令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
这仍然会留下空目录,清空后你可能就不想要了。如果这很重要,那可能是下一次迭代。