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