2

Мне нужно найти и удалить все папки в 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

Кто-нибудь может порекомендовать программу / скрипт для этого? Так как я не очень знаком с терминальными командами, было бы здорово получить некоторое прохождение.

Спасибо!

2 ответа2

4

Достаточно просто с 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 файл или подпапка. Знак @ необходим для правильной работы свойства Count при наличии только 1 элемента (объяснение см. Здесь ).

  • Наконец, Remove-Item удаляет каждую папку, которая прошла через фильтр. Параметр -Recurse необходим для автоматического удаления непустых папок; без этого PowerShell будет подсказывать вам каждый раз.

1

Вот еще одна возможность, используя небольшую программу обработки :

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();
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .