Как удалить все папки/файлы кроме определённых?
Я не знаю в какую сторону копать, поэтому я тут.
Есть папка 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 шт):
например, можно воспользоваться программой 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 прочие опции и параметраы