Answers:
没有理由使用特殊工具甚至脚本。只需在资源管理器中使用搜索功能。
*并按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"
要使用该脚本,只需将您想要展平的文件夹拖到其顶部即可。
您可以通过以下方式在Windows资源管理器中进行展平:浏览到要展平的文件夹,然后搜索System.Kind:<>folder以从结果中排除文件夹。
然后,您可以使用CTRL + A选择所有文件,然后将其复制并粘贴到新文件夹中。请注意,Windows资源管理器将询问您如何处理重复的文件名。
System.Kind:<>cartella)
使用Unix shell,这种事情很容易。这是您可以使用我自己的Hamilton C shell(包括免费版本)进行的操作。您可以使用Cygwin bash进行非常相似的操作。
mv *\* .
如果您的目录确实很大,则可能通配符太长,导致Windows无法传递给子进程的命令行。(Windows CreateProcess调用将参数列表限制为32K Unicode字符。)但是C shell内部没有限制,因此您可以通过以下方式遍历整个列表:
foreach i ( *\* )
mv $i .
end
上面@MarkAllen的观点,这种假设没有重复的名称。如果存在,列表中的较新副本将覆盖较旧的副本。如果这是一个问题,则可以遍历文件,mv仅在不覆盖的情况下对其进行“访问”。该:t操作员是尾操作符。该-e运营商的文件存在测试。
foreach i ( *\* )
if ( -e $i:t ) then
echo -2 $i not moved because it already exists
else
mv $i .
end
end
这仍然留下空目录,清空它们后,您可能不想使用这些目录。如果重要的话,那可能是下一次迭代。
bash,mv */* .为我工作。