Ich muss alle Ordner in C:\parent finden und löschen, die nur eine Datei enthalten. Die Ordnerstruktur ist flach (keine Unterordner):
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
Kann mir jemand ein Programm/Skript dafür empfehlen? Da ich mit Terminalbefehlen nicht sehr vertraut bin, wäre es toll, eine Art Anleitung zu bekommen.
Danke!
Antwort1
Mit PowerShell ist das ganz einfach:
cd C:\Parent
Get-ChildItem | Where-Object { $_.IsPSContainer -and @(Get-ChildItem $_).Count -eq 1 } | Remove-Item -Recurse
Erläuterung:
Die zweite Zeile besteht aus mehreren Befehlen, deren Ausgabe jeweils mithilfe des
|
Zeichens (Pipe) an den nächsten gesendet wird.Get-ChildItem
Gibt eine Liste aller Dateien und Ordner im aktuellen Ordner zurück.Where-Object
ermöglicht uns, diese Liste zu filtern, um nur die Ordner zu erhalten, die den Kriterien entsprechen.$_
bezieht sich bei jeder Iteration auf das aktuelle Objekt.$_.IsPSContainer
Gibt „true“ nur für Ordner zurück, sodass wir alle Dateien im übergeordneten Verzeichnis ausschließen können.@(Get-ChildItem $_).Count -eq 1
gilt nur für Ordner, die genau 1 Datei oder Unterordner enthalten. Das@
Zeichen ist erforderlich, damit dieCount
Eigenschaft korrekt funktioniert, wenn nur 1 Element vorhanden ist (sieheHierzur Erklärung).
Endlich,
Remove-Item
löscht alle Ordner, die den Filter passiert haben. Der-Recurse
Parameter wird benötigt, um nicht leere Ordner automatisch zu löschen. Ohne ihn würde PowerShell Sie jedes Mal dazu auffordern.
Antwort2
Hier ist eine weitere Möglichkeit mit einem kleinenwird bearbeitetProgramm:
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();
}