Encontre pastas com apenas um arquivo

2

Eu preciso encontrar e excluir todas as pastas dentro de C: \ parent que contenham apenas um arquivo. A estrutura da pasta é plana (sem subpastas):

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

Alguém pode recomendar um programa / script para fazer isso? Como não estou muito familiarizado com os comandos do terminal, seria ótimo obter algum tipo de explicação ..

Obrigado!

    
por Pwdr 26.09.2012 / 13:38

2 respostas

4

Simples o suficiente com o PowerShell:

cd C:\Parent
Get-ChildItem | Where-Object { $_.IsPSContainer -and @(Get-ChildItem $_).Count -eq 1 } | Remove-Item -Recurse

Explicação :

  • A segunda linha consiste em vários comandos, cada um dos quais tem sua saída enviada para o próximo usando o caractere | (pipe).

  • Get-ChildItem retorna uma lista de todos os arquivos e pastas no arquivo atual pasta.

  • Where-Object nos permite filtrar essa lista, para obter apenas as pastas correspondentes o critério. $_ refere-se ao objeto atual para cada iteração.

    • $_.IsPSContainer retorna true apenas para pastas, portanto isso nos permite excluir todos os arquivos no diretório pai.

    • @(Get-ChildItem $_).Count -eq 1 é verdadeiro apenas para pastas que tenham exatamente 1 arquivo ou subpasta dentro delas. O sinal @ é necessário para que a propriedade Count funcione corretamente quando há apenas um item (consulte aqui para a explicação).

  • Por fim, Remove-Item exclui cada pasta que passou pelo filtro . O parâmetro -Recurse é necessário para excluir automaticamente pastas não vazias; sem isso, o PowerShell sempre perguntaria a você.

por 26.09.2012 / 14:03
1

Aqui está outra possibilidade usando um pequeno programa Processando :

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();
}
    
por 26.09.2012 / 14:18