Удалите все каталоги из родительского каталога кроме одного и его потомков

directory structure

Я хочу удалить каталог B и D. Но я хочу сохранить C и все его происходящие файлы и каталоги. Что команда должна удалить все дочерние каталоги родительского каталога кроме одного каталога и его детей.

Help ценится.

8
задан 29 July 2016 в 14:33

4 ответа

То, что Вы хотите, является этой командой:

find ~/TESTDIR -mindepth 1 -maxdepth 1 -type d -not \( -name "keepMe" \) -exec rm -rf {} \;

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

# List what's inside directory we want to remove
$ ls
file1  file2  keepMe/  removeA/  removeB/
# Testing what find gives without removing
$ find ~/TESTDIR -mindepth 1 -type d -not \( -name "keepMe" \)               
/home/xieerqi/TESTDIR/removeA
/home/xieerqi/TESTDIR/removeB
# Actual removal and testls
$ find ~/TESTDIR -mindepth 1 -maxdepth 1 -type d -not \( -name "keepMe" \) -exec rm -rf {} \;
$ ls
file1  file2  keepMe/

Объяснение:

  • find DIRECTORY вызов находят, что команда работает на КАТАЛОГ
  • -mindepth 1: работайте только с содержанием каталога, избегайте самого каталога, который является уровнем 0
  • -maxdepth 1: предотвращает убывание в подкаталоги (rm -rf, является рекурсивным так или иначе, таким образом, мы не должны убывать в подкаталоги для удаления их)
  • -type d: ищите только каталоги
  • -not \( -name "keepMe" \), игнорируют объект с именем, которое Вы хотите сохранить
  • -exec rm -rf {} \;, выполняют удаление на каждом найденном объекте
6
ответ дан 23 November 2019 в 05:22

Используя оболочку удара расширенный шарик функции (которые включены по умолчанию в текущих установках Ubuntu), учитывая

$ tree A
A
├── B
├── C
│   ├── ac1
│   └── ac2
└── D

5 directories, 0 files

можно обратиться ко всему, исключая C и его содержание с помощью выражения A/!(C) т.е.

$ echo A/!(C)
A/B A/D

шарика, Таким образом, к удаляют все кроме каталога C и его содержания, можно просто использовать

rm -rf A/!(C)

отъезд

$ tree A
A
└── C
    ├── ac1
    └── ac2

3 directories, 0 files
8
ответ дан 23 November 2019 в 05:22

Просто используйте Bash for цикл и test для фильтрации желаемых каталогов и эти rm -rf команда для рекурсивного удаления каталогов, как это:

for x in /path/to/parent/*; do test "$x" != "dir_survive" && rm -rf "$x"; done

Это выполняет итерации по всем элементам (файлы и каталоги) в /path/to/parent/ и удаляет элемент рекурсивно, если его имя не равно dir_survive. Если родительский каталог является текущим каталогом, можно только записать * как путь.

, Если бы Вы не уверены и хотите протестировать, какие элементы удалить сначала, не принимая мер, просто замените rm -rf в команде выше с echo, и это только произведет удалить кандидатов.

Вот выполненный пример:

$ tree
.
├── dir1
│   ├── subdir1
│   │   ├── file1
│   │   └── file2
│   └── subdir2
│       ├── file1
│       └── file2
├── dir2
│   ├── subdir1
│   │   ├── file1
│   │   └── file2
│   └── subdir2
│       ├── file1
│       └── file2
└── dir_survive
    ├── subdir1
    │   ├── file1
    │   └── file2
    └── subdir2
        ├── file1
        └── file2

9 directories, 12 files

$ for x in *; do test "$x" != "dir_survive" && rm -rf "$x"; done

$ tree
.
└── dir_survive
    ├── subdir1
    │   ├── file1
    │   └── file2
    └── subdir2
        ├── file1
        └── file2

3 directories, 4 files
4
ответ дан 23 November 2019 в 05:22

Один простой способ состоял бы в том, чтобы использовать мусор-cli

, можно установить его с sudo apt-get install trash-cli

, когда-то установил Вас, может перейти к родительскому каталогу с cd /A и затем выпустить команду trash B D, где B и D являются каталогами, Вы хотите удалить (они закончат в корзине для диска, они идут поэтому, если Вы делаете ошибку, можно восстановить файлы)

Протестированный в соответствии с Ubuntu 16.04 и 14.04

5
ответ дан 23 November 2019 в 05:22

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

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