尋找只有一個檔案的資料夾

尋找只有一個檔案的資料夾

我需要查找並刪除 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();
}

相關內容