Necesito buscar y eliminar todas las carpetas dentro de C:\parent que contienen solo un archivo. La estructura de carpetas es plana (sin subcarpetas):
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
¿Alguien puede recomendar un programa/script para hacer esto? Como no estoy muy familiarizado con los comandos de terminal, sería genial obtener algún tipo de tutorial.
¡Gracias!
Respuesta1
Bastante simple con PowerShell:
cd C:\Parent
Get-ChildItem | Where-Object { $_.IsPSContainer -and @(Get-ChildItem $_).Count -eq 1 } | Remove-Item -Recurse
Explicación:
La segunda línea consta de varios comandos, cada uno de los cuales envía su salida al siguiente mediante el
|
carácter (tubería vertical).Get-ChildItem
devuelve una lista de todos los archivos y carpetas de la carpeta actual.Where-Object
nos permite filtrar esa lista, para obtener solo las carpetas que coinciden con los criterios.$_
se refiere al objeto actual para cada iteración.$_.IsPSContainer
devuelve verdadero solo para las carpetas, por lo que esto nos permite excluir cualquier archivo en el directorio principal.@(Get-ChildItem $_).Count -eq 1
es cierto solo para carpetas que tienen exactamente 1 archivo o subcarpeta dentro de ellas. El@
letrero es necesario para que laCount
propiedad funcione correctamente cuando solo hay 1 elemento (veraquípara la explicación).
Finalmente,
Remove-Item
elimina cada carpeta que pasó por el filtro. El-Recurse
parámetro es necesario para eliminar automáticamente carpetas que no estén vacías; sin él, PowerShell le avisaría cada vez.
Respuesta2
Aquí hay otra posibilidad usando un pequeñoProcesandoprograma:
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();
}