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

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

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

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

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

7
задан 13 April 2017 в 05:24

2 ответа

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

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
17
ответ дан 23 November 2019 в 06:07

Можно использовать расширенный глобус, но восклицательный знак идет до шаблона:

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

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

shopt -s extglob
18
ответ дан 23 November 2019 в 06:07

Другие вопросы по тегам:

Похожие вопросы: