查找仅包含一个文件的文件夹

查找仅包含一个文件的文件夹

我需要查找并删除 C:\parent 中所有仅包含一个文件的文件夹。文件夹结构是扁平的(没有子文件夹):

C:\parent\folder1\file1
C:\parent\folder1\file2
C:\parent\folder2\file1 <-- Delete folder2
C:\parent\folder3\file1 <-- Delete folder3
C:\parent\folder4\file1
C:\parent\folder1\file2
C:\parent\folder1\file3

有人可以推荐一个程序/脚本来执行此操作吗?由于我对终端命令不太熟悉,因此获得某种演练会很棒。

谢谢!

答案1

使用 PowerShell 非常简单:

cd C:\Parent
Get-ChildItem | Where-Object { $_.IsPSContainer -and @(Get-ChildItem $_).Count -eq 1 } | Remove-Item -Recurse

解释

  • 第二行由多个命令组成,每个命令都使用|(管道)字符将其输出发送到下一个命令。

  • Get-ChildItem返回当前文件夹中所有文件和文件夹的列表。

  • Where-Object允许我们过滤该列表,以仅获取符合条件的文件夹。$_指的是每次迭代的当前对象。

    • $_.IsPSContainer仅对文件夹返回 true,因此这允许我们排除父目录中的任何文件。

    • @(Get-ChildItem $_).Count -eq 1仅适用于其中只有 1 个文件或子文件夹的文件夹。当只有 1 个项目时,该@符号是该属性正常工作所必需的(请参阅Count这里以获得解释)。

  • 最后,Remove-Item删除通过筛选的每个文件夹。-Recurse需要此参数才能自动删除非空文件夹;如果没有此参数,PowerShell 每次都会提示您。

答案2

这是另一种使用小加工程序:

String parentFolder = "M:\\INSERT_PARENT_DIR_HERE";

void setup(){
  File fParentFolder = new File(parentFolder);
  println("Scanning " + fParentFolder.getAbsolutePath());
  println("Folder exists: " + fParentFolder.exists());
  File[] folderList = fParentFolder.listFiles();
  println("Number of files/folders: " + folderList.length);
  println("-----------------------------------");
  for(int i=0; i<folderList.length; i++){
    if(folderList[i].isDirectory() && folderList[i].list().length < 2){
      println("Deleting directory: " + folderList[i].getAbsolutePath() + "\t\t" + deleteDir(folderList[i]));  
    } 
  }
}


// Deletes all files and subdirectories under dir.
// Returns true if all deletions were successful.
// If a deletion fails, the method stops attempting to delete and returns false.
public static boolean deleteDir(File dir) {
    if (dir.isDirectory()) {
        String[] children = dir.list();
        for (int i=0; i<children.length; i++) {
            boolean success = deleteDir(new File(dir, children[i]));
            if (!success) {
                return false;
            }
        }
    }

    // The directory is now empty so delete it
    return dir.delete();
}

相关内容