Как удалить дерево каталогов, исключая определенные подкаталоги, используя Gradle? - PullRequest
0 голосов
/ 10 апреля 2019

Моя структура каталогов следующая:

dir -|
     |
     - sub_dir1 -|
     |           |
     |           - file1
     |
     - sub_dir2 -|
     |           |
     |           - file2
     |
     - sub_dir3 -|
                 |
                 - file3

Я хочу рекурсивно удалить все содержимое dir, за исключением содержимого sub-dir1

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

dir -|
     |
     - sub_dir1 -|
                 |
                 - file1

Я попробовал следующий код, и он удаляет все файлы, кроме содержимого sub_dir1. Однако он не удаляет другие подкаталоги, а только файлы в этих каталогах.

  delete fileTree(dir: "dir1").exclude("sub_dir1").include('**/**')

Результат вышеприведенного кода:

dir -|
     |
     - sub_dir1 -|
     |           |
     |           - file1
     |
     - sub_dir2 
     |           
     |
     - sub_dir3

Как я могу удалить эти каталоги вместе с содержащимися в них файлами?

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

Ну, проблема в том, что FileTree просто интересует файлы, поэтому каталоги не возвращаются.Однако можно использовать метод visit для итерации как файлов, так и каталогов.Таким образом, вы можете упростить свое решение до чего-то похожего на следующее.Он использует функциональность Gradle fileTree, но требует нескольких вызовов delete:

fileTree('dir').exclude('sub_dir1').visit { delete it.file }

Другой вариант - использование функций, предоставляемых непосредственно Groovy:

file('dir').eachDirMatch({ !it.equals('sub_dir1') }, { delete it })

Еще несколько вызовов дляdelete требуется.Также фильтр довольно уродлив по сравнению с exclude вызовом Gradles FileTree.Прямая фильтрация может использоваться через Groovy collect, который затем может быть помещен в один оператор delete, поскольку он может обрабатывать Iterable из File объектов.Однако для этого, скорее всего, потребуется более подробный код, поэтому я бы порекомендовал выбрать первые предложенные варианты.

0 голосов
/ 10 апреля 2019

На данный момент мне удалось выполнить мое требование, используя следующий код:

Arrays.stream(new File("dir").list()).forEach {
  f -> if (f != "sub_dir1") {
    delete "dir/${f}"
  }
}

Лучше подходы приветствуются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...