1

Как удалить папки и там содержимое и сохранить файлы в текущем каталоге?

до

parent
├── folder1
├── folder2
│   ├── file1
│   ├── file2
├── folder3
├── file3
├── file4
└── file5

после:

parent
├── file3
├── file4
└── file5

2 ответа2

3

Нечто подобное должно сработать

cd parent
find . ! -path . -maxdepth 1 -type d -exec rm -rf {} \;

При этом будут искать каталоги в текущем рабочем каталоге, и будет возвращаться только на 1 уровень вниз, а каталоги удаляются. Лучше всего выполнить тест-запуск с помощью ls вместо rm, чтобы вы могли проверить, что будет удалено

cd parent
find . ! -path . -maxdepth 1 -type d -exec ls {} \;

пример

jake@jake-HP /tmp/test $ tree
.
├── 1
├── 2
├── bar
│   ├── 1
│   ├── 2
│   └── 3
├── blah
│   ├── 1
│   ├── 2
│   └── 3
└── foo
    ├── 5
    └── 9

3 directories, 10 files
jake@jake-HP /tmp/test $ find . ! -path . -maxdepth 1 -type d -exec ls {} \;
1  2  bar  blah  foo
1  2  3
5  9
1  2  3
jake@jake-HP /tmp/test $ find . ! -path . -maxdepth 1 -type d -exec rm -rf {} \;
jake@jake-HP /tmp/test $ tree
.
├── 1
└── 2

0 directories, 2 files
0

Использование find - это хорошо, потому что вы точно указываете, что хотите сделать. Однако у xargs в ответе Джейка есть проблема с именами каталогов, содержащими пробелы. Вам нужно добавить -print0, чтобы найти, и -0 в xargs.

Я бы написал

find parent -type d -mindepth 1 -maxdepth 1 -exec rm -rf '{}' \;

Это еще проще:

rm -rf parent/*/

Тем не менее, он не удалит скрытые каталоги (начиная с точки), вам нужно добавить их:

rm -rf parent/*/ parent/.[^.]*/

Остерегайтесь, если у вас есть символические ссылки, указывающие в другом месте, хотя.

Если вы не доверяете */ сопоставлять только каталоги, менее чистое решение, которое приведет к большому количеству ошибок (и которое не учитывает скрытые каталоги, потому что это усложняется)

rm -rf parent/*/* 
rmdir parent/*

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .