Удалить все файлы, кроме указанных файлов / папок, используя командную строку?

6

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

NASA
│
├── a
│   ├── doc1
│   ├── doc2
│   ├── doc3
│   ├── folder1
│   └── folder2
│
├── b
│   ├── doc1
│   ├── doc2
│   ├── doc3
│   ├── folder1
│   └── folder2
│
├── c
│   ├── doc1
│   ├── doc2
│   ├── doc3
│   ├── folder1
│   └── folder2
│
├─ x
├─ y
└─ z     

Я хочу удалить содержимое папки ( NASA/ ), кроме указанных папок и файлов.

Например, я хочу сохранить папку a , b и x .

Я попробовал это решение

 rm !(a/) -r NASA/

И (как объяснено в ответе здесь ):

find NASA/ -type f ! -iname "x" -delete

Но это не очень прямолинейно, и я должен использовать скрипт bash.

Я пропустил более простой способ? Как я могу сделать это в одной команде?

    
задан hg8 23.10.2015 в 12:05
источник

2 ответа

14

Вы можете использовать GLOBIGNORE для установки имен, которые будут игнорироваться во время globbing, а затем использовать * для соответствия всем другим файлам / каталогам:

GLOBIGNORE='a:b:x'; rm -r *

Пример:

$ tree 
.
├── a
│   ├── 1
│   ├── 2
│   └── 3
├── b
│   ├── 1
│   ├── 2
│   └── 3
├── c
│   ├── 1
│   ├── 2
│   └── 3
├── x
├── y
└── z

/NASA$ GLOBIGNORE='a:b:x'

/NASA$ rm -r *

/NASA$ tree 
.
├── a
│   ├── 1
│   ├── 2
│   └── 3
├── b
│   ├── 1
│   ├── 2
│   └── 3
└── x

В качестве альтернативы вы можете использовать find , из каталога NASA :

find . -maxdepth 1 ! -name '.' ! -regex '.*/\(a\|b\|x\)$' -exec rm -r {} +

Пример:

/NASA$ tree 
.
├── a
│   ├── 1
│   ├── 2
│   └── 3
├── b
│   ├── 1
│   ├── 2
│   └── 3
├── c
│   ├── 1
│   ├── 2
│   └── 3
├── x
├── y
└── z


/NASA$ find . -maxdepth 1 ! -name '.' ! -regex '.*/\(a\|b\|x\)$' -exec rm -r {} +


/NASA$ tree 
.
├── a
│   ├── 1
│   ├── 2
│   └── 3
├── b
│   ├── 1
│   ├── 2
│   └── 3
└── x
    
ответ дан heemayl 23.10.2015 в 12:24
источник
16

Вы можете использовать расширенное globbing, но восклицательный знак идет до шаблона:

rm -rf NASA/!(a|b|x)

Если extglob не включено, сначала активируйте его:

shopt -s extglob
    
ответ дан choroba 23.10.2015 в 12:18