파일이 하나만 있는 폴더 찾기

파일이 하나만 있는 폴더 찾기

하나의 파일만 포함된 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();
}

관련 정보