Как удалить все папки/файлы кроме определённых?

Я не знаю в какую сторону копать, поэтому я тут.

Есть папка messages, в которой хранится локализация. Нужно удалить в ней все папки рекурсивно, кроме папки с именами ru/ru-RU. Все папки в таком формате: либо две буквы us/ru/hr, либо стандартно четыре ru-RU/en-US и т.д.

Или папка i18n, в которой хранится локализация. Нужно удалить в ней все файлы, кроме файлов с именами ru.js/ru-RU.js. Все файлы в таком формате: либо две буквы us.js/ru.js/hr.js, либо стандартно четыре ru-RU.js/en-US.js и т.д.


Про удаление sudo rm -rf PATH_TO_FOLDER и sudo rm -rf PATH_TO_FOLDER/* знаю. Но вот как удалить все кроме указанных - не знаю.

Как это сделать?

P.S. На каком уровне вложенности находятся те самыe папки messages и i18n, в которых находятся папки/файлы для удаления - я не знаю. А удалять все папки мне не нужно. Нужно удалять только в папках локализаций (их может быть несколько под некоторые плагины)


Пример структуры

- 1
  - messages
    - ru
    - en
    - hr
- 2
  - src
    - plug
      - messages
        - ru
        - en
        - ja
        - ku
- 3
  - table-builder
    - src
      - i18n
        - en.js
        - hr.js
        - la.js
        - ru.js
- 4
  - drop-down
    - src
      - assets
        - js
          - i18n
            - en.js
            - gb.js
            - ru-RU.js

Ответы (1 шт):

Автор решения: aleksandr barakin

например, можно воспользоваться программой find.

демонстрация:

$ mkdir -p 1/messages/{ru,en,hr} 2/src/plug/messages/{ru,en,ja,ku} 3/table/src/i18n/{en,hr,la,ru}.js 4/drop/src/assets/js/i18n/{en,gb,ru-RU}.js
$ tree
.
├── 1
│   └── messages
│       ├── en
│       ├── hr
│       └── ru
├── 2
│   └── src
│       └── plug
│           └── messages
│               ├── en
│               ├── ja
│               ├── ku
│               └── ru
├── 3
│   └── table
│       └── src
│           └── i18n
│               ├── en.js
│               ├── hr.js
│               ├── la.js
│               └── ru.js
└── 4
    └── drop
        └── src
            └── assets
                └── js
                    └── i18n
                        ├── en.js
                        ├── gb.js
                        └── ru-RU.js

30 directories, 0 files

каталоги, которые надо оставить:

$ find -type d -name ru\*
./3/table/src/i18n/ru.js
./1/messages/ru
./2/src/plug/messages/ru
./4/drop/src/assets/js/i18n/ru-RU.js

логическое отрицание:

$ find -type d \! -name ru\*
.
./3
./3/table
./3/table/src
./3/table/src/i18n
./3/table/src/i18n/en.js
./3/table/src/i18n/la.js
./3/table/src/i18n/hr.js
./1
./1/messages
./1/messages/hr
./1/messages/en
./2
./2/src
./2/src/plug
./2/src/plug/messages
./2/src/plug/messages/en
./2/src/plug/messages/ja
./2/src/plug/messages/ku
./4
./4/drop
./4/drop/src
./4/drop/src/assets
./4/drop/src/assets/js
./4/drop/src/assets/js/i18n
./4/drop/src/assets/js/i18n/en.js
./4/drop/src/assets/js/i18n/gb.js

чтобы удалять, лучше добавить опцию -depth, которая выдаст список «от самого длинного пути к самому короткому»:

$ find -depth -type d \! -name ru\*
./3/table/src/i18n/en.js
./3/table/src/i18n/la.js
./3/table/src/i18n/hr.js
./3/table/src/i18n
./3/table/src
./3/table
./3
./1/messages/hr
./1/messages/en
./1/messages
./1
./2/src/plug/messages/en
./2/src/plug/messages/ja
./2/src/plug/messages/ku
./2/src/plug/messages
./2/src/plug
./2/src
./2
./4/drop/src/assets/js/i18n/en.js
./4/drop/src/assets/js/i18n/gb.js
./4/drop/src/assets/js/i18n
./4/drop/src/assets/js
./4/drop/src/assets
./4/drop/src
./4/drop
./4
.

теперь удалим их, добавив опцию -delete (на ошибки про непустой каталог не обращаем внимание):

$ find -depth -type d \! -name ru\* -delete
find: cannot delete ‘./1/messages’: Directory not empty
...

что осталось:

$ tree
.
├── 1
│   └── messages
│       └── ru
├── 2
│   └── src
│       └── plug
│           └── messages
│               └── ru
├── 3
│   └── table
│       └── src
│           └── i18n
│               └── ru.js
└── 4
    └── drop
        └── src
            └── assets
                └── js
                    └── i18n
                        └── ru-RU.js

20 directories, 0 files

p.s. разумеется, программе find можно указать лишь нужные каталоги для поиска:

$ find каталог1 каталог2 прочие опции и параметраы
→ Ссылка