【问题标题】:Batch to remove all subfolders that don't have subfolders of their own批量删除所有没有自己的子文件夹的子文件夹
【发布时间】:2014-02-22 22:31:54
【问题描述】:

为了更具体地了解这个问题,我有一个文件夹层次结构。

Render/a/b/c/d/e/f

其中 a-f 是 1 到 4 之间的数字。

例如,您可以拥有.. 渲染/1/1/3/2/4/1/(Somefile.jpg)

由于空间限制,我不需要最后一层子文件夹或其内容。

我的想法是编写一个批处理文件,该文件将遍历所有文件夹及其子文件夹,直到找到不包含另一个子文件夹的文件夹,表示它是最后一个文件夹,然后删除该文件夹以及它的内容。

系统设置的方式,是有一个基础渲染。该渲染分为 4 个子渲染,这些渲染更详细(因此有 1-4 个子目录)。 因此,每个文件夹可能包含 4 个图像,以及 4 个包含更小、更详细的图像的子目录。 该文件夹不需要包含所有 4 个子目录,这取决于该特定渲染的大小。 最后,有一组不需要的最详细的图像。

我能理解 rd /q /s 目录 1 一段代码,以及 对于 %%i in (set) 但是能够将它们结合起来执行这项任务让我感到困惑。

1) 定位渲染目录的所有子目录。 2)移动到第一个目录,并找到该目录的所有子目录。 3) 重复步骤 2 4)如果没有子目录,我知道它是最后一次渲染 5)删除内容和目录 6) 移回一个目录,然后继续 7) 对第 2、3、4 个目录重复整个过程。

我可以使用 c# 执行此任务,但我需要有一个 .bat 文件。

编辑: 我最初选择批处理的原因是因为它很简单,只需要一个文件。但是,我决定使用 perl 脚本,因为两个文件并不比一个差多少。

# read zoomlevel from generated file.js
my $zoomlevel=0;
my $maxzoom=0;
if (open OC,"Render/file.js")
{
  foreach (<OC>)
  {
    if (index($_, "zoomLevels") != -1)
    {
      @data = split(' ', $_);

      $zoomlevel=substr $data[1],0,1;
      print "$data[1]\n";
      print "$zoomlevel\n";
    }
    if (index($_, "maxZoom") != -1)
    {
      @data = split(' ', $_);

      $maxzoom=substr $data[1],0,1;
      print "$data[1]\n";
      print "$maxzoom\n";
    }
  }
  my $numdelete=$zoomlevel-$maxzoom;
  print "I'm going to delete $numdelete zoomlevels.\n";
  for($count = 0; $count < $numdelete; $count++) {
    print "deleting zoomlevel ".($zoomlevel-$count).".\n";
    my $delstr = "Render/render/".'*/' x ($zoomlevel-$count)."*.jpg";
    unlink glob "$delstr";
  }
}
else
  {print "couldn't open file\n";}

然后我简单地创建了一个运行 perl 脚本的批处理文件。

@echo off
perl removal.pl
pause

【问题讨论】:

  • Stack Overflow 是一个面向专业和爱好者程序员的问答网站。问题必须表明对要解决的问题的基本了解。告诉我们您尝试过什么,为什么它不起作用,以及它应该如何起作用。另见:Stack Overflow question checklist.

标签: loops batch-file recursion directory


【解决方案1】:

可以像这样使用批处理语言来完成。给定以下文件夹/文件结构:

New folder
├───New folder (2)
│   │   New Text Document (2).txt
│   │   New Text Document.txt
│   │
│   └───New folder (3)
│       │   New Text Document (2).txt
│       │
│       └───New folder (5)
│               New Text Document (3).txt
│
└───New folder (4)
    │   New Text Document (3).txt
    │
    └───New folder (6)
        │   New Text Document (4).txt
        │
        ├───New folder (7)
        │       New Text Document.txt
        │
        └───New folder (8)
            │   New Text Document (4).txt
            │
            └───New folder (9)
                    New Text Document (5).txt

应删除文件夹 5、7 和 9。运行以下批处理文件后:

@echo off

setlocal ENABLEDELAYEDEXPANSION

cd "New folder"

for /f "tokens=1* delims=" %%i in ('dir /a:d /b /s') do (
  dir "%%i" /a:d | find /i " 2 Dir(s)" > nul
  if !errorlevel!==0 rd "%%i" /s /q
)

cd ..

endlocal

文件夹/文件结构如下所示:

New folder
├───New folder (2)
│   │   New Text Document (2).txt
│   │   New Text Document.txt
│   │
│   └───New folder (3)
│           New Text Document (2).txt
│
└───New folder (4)
    │   New Text Document (3).txt
    │
    └───New folder (6)
        │   New Text Document (4).txt
        │
        └───New folder (8)
                New Text Document (4).txt

for 循环枚举所有文件夹并将文件夹名称传递给dir ... | find ... 命令。如果它找到2 Dir(s),即... 文件夹,它知道没有其他子文件夹并删除该文件夹。

【讨论】:

  • 当有 12 个或 22 个或 32 个目录等时,这将失败。"2 Dir(s)" 必须有一个前导空格 " 2 Dir(s)"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
  • 2014-02-10
  • 1970-01-01
相关资源
最近更新 更多