繁体   English   中英

在Windows 7(cmd或PowerShell)上压缩子文件夹中的文件

[英]Flatten Files in Subfolders on Windows 7 (cmd or PowerShell)

我有大量的文件组织在一个非常分层的文件夹结构中。 在此结构中,我关心的文件始终位于文件夹的最低级别。 因此,我想展平目录,以便更容易访问我关心的文件。 但是,我想保留文件夹结构的2个更高级别(Person&Project)。

以下是EXISTING文件夹目录的示例:

  • 目录
    • 汤姆
      • 项目1
        • 子文件夹级别A.
          • FILEA
        • FILEB
      • 项目2
        • 子文件夹级别C.
          • FileC
        • 提交
    • 杰瑞
      • 项目1
        • 子文件夹级别E.
          • FileE

以下是DESIRED文件夹目录的示例:

  • 目录
    • 汤姆
      • 项目1
        • FILEA
        • FILEB
      • 项目2
        • FileC
        • 提交
    • 杰瑞
      • 项目1
        • FileE

我尝试过这样的事情,但是这会将所有文件压缩成一个目录:

for /r %f in (*) do @copy "%f" .

但是,这会产生:

  • 目录
    • FILEA
    • FILEB
    • FileC
    • 提交
    • FileE

我很感激您提供的任何指导。 非常感谢!

在那个有效的循环周围抛出几个额外的循环。

例如,首先更改为名称文件夹,然后是项目文件夹,循环遍历两个级别。

for /D %n in (*) do (
    pushd %n
    for /D %p in (*) do (
        pushd %p
        for /r %f in (*) do @copy "%f" .
        popd
    )
    popd
)

如果你把它放在一个bat文件中,记得用%%替换%

这是一个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。

@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变量或延迟扩展,因为解析命令的方式。

我调整了@ 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 到目前为止它看起来非常直观,就像它在没有我太多努力的情况下处理问题:)

感谢大家的帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM