Как удалить все папки, кроме нескольких упомянутых в linux

У меня есть следующая структура папок внутри моей папки wp-content =>

2016/ => it has many subfolders in it and I wanna keep them
2015/ => it has many subfolders in it and I wanna keep them
2014/ => it has many subfolders in it and I wanna keep them
2013/ => it has many subfolders in it and I wanna keep them

besides those folder there are tons of temp folders which I want to delete along with anything inside it. The folder name look like this:

ZhsvhgTjh/
Vgfsugu79/
1agDjgdki/
8gdygREfh/
Hbjddsyug/
....so on....

Теперь проблема в том, что если я запущу rm -f, то он удалит все внутри этой папки, включая такие папки, как 2016, 2015, 2014, 2013.

Кроме того, если я попробую следующее: find . -name a -exec rm -rf {} \;, тогда это будет работать только для 1 имени папки, и я буду вводить каждое случайное имя папки, что безумно, поскольку в нем почти 20 000+ временных папок.

Итак, я надеялся, что кто-нибудь может помочь мне с командой, с помощью которой я могу удалить все папки и содержимое внутри нее, кроме папок 2016, 2015, 2014, 2013 и их содержимого.

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

Спасибо.


person iSaumya    schedule 10.12.2016    source источник
comment
Возможный дубликат Как найти файлы, кроме заданного имени?   -  person Daniel Scott    schedule 10.12.2016


Ответы (1)


Распечатать дерево

prodrive11@raccoon:~/tmpp/wp-content$ ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/   /' -e 's/-/|/'
   .
   |-2015
   |---keep2
   |---keep3
   |-2016
   |---keep1
   |---keep2
   |-NKAXOIND
   |-x232sfsw
   |---we233ds

Показать мусорные папки:

   prodrive11@raccoon:~/tmpp/wp-content$ find . -type d | grep -Pv '20\d{2}' | tail -n +2                   ./x232sfsw
    ./x232sfsw/we233ds
    ./NKAXOIND

Посчитай их

prodrive11@raccoon:~/tmpp/wp-content$ find . -type d | grep -Pv '20\d{2}' | tail -n +2 | wc -l
3

Удалить их

prodrive11@raccoon:~/tmpp/wp-content$ find . -type d | grep -Pv '20\d{2}' | tail -n +2 | xargs rm -rf

Показать дерево снова

prodrive11@raccoon:~/tmpp/wp-content$ ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/   /' -e 's/-/|/'
   .
   |-2015
   |---keep2
   |---keep3
   |-2016
   |---keep1
   |---keep2
person bua    schedule 10.12.2016
comment
Привет, у меня есть вопрос. Если я хочу исключить больше папок, например, скажем, ai хочу исключить следующие папки и все содержимое в них: 2016/ 2015/, 2014/, nginx-helper/, wpseo-redirects/, gravity_forms/ как я могу отредактировать приведенную выше команду в соответствии со своими потребностями? Как я вижу, вы исключаете только папки, начинающиеся с 20. Спасибо за вашу помощь. - person iSaumya; 10.12.2016
comment
Просто добавьте больше регулярных выражений в grep, первое 20\d{2} соответствует всем годам 1-го века 2000-2099 find . -type d | grep -Pv '(20\d{2}|nginx|wpseo)' | tail -n +2 - person bua; 10.12.2016