Я хочу удалить каталог B и D. Но я хочу сохранить C и все его происходящие файлы и каталоги. Что команда должна удалить все дочерние каталоги родительского каталога кроме одного каталога и его детей.
Help ценится.
То, что Вы хотите, является этой командой:
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 {} \;
, выполняют удаление на каждом найденном объекте Используя оболочку удара расширенный шарик функции (которые включены по умолчанию в текущих установках 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
Просто используйте 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
Один простой способ состоял бы в том, чтобы использовать мусор-cli
, можно установить его с sudo apt-get install trash-cli
, когда-то установил Вас, может перейти к родительскому каталогу с cd /A
и затем выпустить команду trash B D
, где B и D являются каталогами, Вы хотите удалить (они закончат в корзине для диска, они идут поэтому, если Вы делаете ошибку, можно восстановить файлы)
Протестированный в соответствии с Ubuntu 16.04 и 14.04