我有大量文件以非常分层的文件夹结构组织。在此结构中,我关心的文件始终位于文件夹的最低级别。因此,我想展平目录,以便更容易访问我关心的文件。但是,我想保留文件夹结构的2个更高级别(Person& Project)。
以下是 EXISTING 文件夹目录的示例:
以下是 DESIRED 文件夹目录的示例:
我尝试过这样的事情,但这会将所有文件展平为一个目录:
for /r %f in (*) do @copy "%f" .
但是,这会产生:
我很感激您提供的任何指导。非常感谢!
答案 0 :(得分:2)
在那个有效的循环周围抛出几个额外的循环。
e.g。首先更改为名称文件夹,然后是项目文件夹,循环遍历两个级别。
for /D %n in (*) do (
pushd %n
for /D %p in (*) do (
pushd %p
for /r %f in (*) do @copy "%f" .
popd
)
popd
)
如果将其放入bat文件中,请记住将%替换为%%
答案 1 :(得分:0)
这是一个Powershell方法。它获取所需级别的文件夹列表。然后它将所有子文件移动到该级别。它还会删除子文件夹。
$Rootfolder = Dir directory\*\* -Directory
ForEach($folder in $Rootfolder)
{
Dir $folder.fullname -Recurse -File | Copy-Item -Destination $folder.fullname
Dir $folder.fullname -Recurse -Directory | Remove-Item -Force -Recurse -WhatIf
}
如果要删除它,请从最后一行删除-WhatIf。
答案 2 :(得分:0)
@echo off
pushd yourDirectory
for /d %%A in (*) do for /d %%B in ("%%A\*") do for /d %%C in ("%%B\*") do (
pushd "%%C"
for /r %%F in (*) do move /y "%%F" "%%B" >nul
popd
rd /q /s "%%C"
)
popd
%% A包含类似“yourDirectory \ Tom”的内容
%% B包含类似“yourDirectory \ Tom \ Project 1”的内容
%% C包含类似“yourDirectory \ Tom \ Project 1 \ subdirectory1”的内容
%% F包含要移动到任何深度的文件
起初我以为我可以消除PUSHD / POPD并使用
for /r "%%C" %%F in (*) do ... THIS DOES NOT WORK
但是这不起作用 - / R之后的值不能使用FOR变量或延迟扩展,因为解析命令的方式。
答案 3 :(得分:0)
我调整了@ ScottC的回答并使用了以下代码:
for /D %%n in (*) do (
pushd %%n
for /D %%p in (*) do (
pushd %%p
for /r %%f in (*.ppt) do (
move "%%f" "[ROOT_PATH_THAT_I_WANT]\%%n\%%p".
)
popd
)
popd
)
我将此解决方案作为.bat文件运行,这就是我使用%%而不是%。
的原因 %% n = name(又名C:\ Directory \ Name)
%% p =项目(又名C:\ Directory \ Name \ Project)
%% f =要移动的文件(递归浏览文件夹并将它们移动到项目级别)
最终,我无法得到@ dbenham关于删除空文件夹的建议,所以我最终使用了这个实用程序:http://www.jonasjohn.de/red.htm。到目前为止它似乎非常直观,并且在没有我太多努力的情况下就像是在处理问题:)
感谢大家的帮助!