удалить подпапки без удаления родительской папки

15

Для этого типа структуры dir:

/config/filegroups/filegroupA/files/fileA1.txt
/config/filegroups/filegroupA/files/fileA2.txt
/config/filegroups/filegroupB/files/fileB1.txt
/config/filegroups/filegroupB/files/fileB2.txt
...

Я знаю, что могу использовать rm -rf /config/filesgroupsдля удаления родительской папки и всех подпапок ...

но я хочу , чтобы удалить только /filegroupA, /filegroupBи т.д., а не удалять/config/filegroups

BaltoStar
источник
13
Есть ли проблемы с использованием rm -rf / config / filesgroups / *?
dsmsk80
3
Или, может быть, даже rm -rf /config/filegroups/filegroups{A,B}?
Драв Слоан
@dsumsky По умолчанию bashне включает '.' папки в пути расширения. Который может или не может быть желательным. Сам я shopt -s dotglobв .bashrcэто исправить. Просто примечание, что кто-то может найти полезным;).
Мирослав Кошкар
Это работало на вас? Если да, не могли бы вы принять ответ, чтобы помочь другим (например, мне), которые хотят сделать то же самое?
Mawg говорит восстановить Монику
rm -rf /*будет делать;) --- серьезно не делай этого
Мухаммед Умер

Ответы:

28
rm -rf /config/filegroups/*

Если вы хотите удалить только каталоги (и символические ссылки на каталоги), оставив все файлы без изменений /config/filegroups, вы можете использовать косую черту:

rm -rf /config/filegroups/*/

Если вы хотите удалить каталоги с именами, начинающимися также с a ., если у вас довольно недавний bash, вам следует использовать опцию оболочки dotglob:

shopt -s dotglob
rm -rf /config/filegroups/*/
shopt -u dotglob
evilsoup
источник
и, пожалуйста, не надо, чтобы он не работал для rm -rf "/ config / filegroups / *"
Илья Евлампиев
5

Это приведет к удалению всех файлов и каталогов, в /config/filegroupsтом числе «скрытых» файлов и каталогов (имена начинаются с .).

find /config/filegroups -mindepth 1 -maxdepth 1 | xargs rm -rf

Если имена файлов или каталогов содержат пробелы, вы должны сделать это следующим образом:

find /config/filegroups -mindepth 1 -maxdepth 1 -print0 | xargs -0 rm -rf

Бонус: вы можете сначала проверить, что будет удалено следующим образом:

find /config/filegroups -mindepth 1 -maxdepth 1

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

find /config/filegroups -mindepth 1 -maxdepth 1 -not -name "keep"
lesmana
источник
Есть ли какая - либо причина не использовать find«s -deleteварианта?
evilsoup
4
-deleteотказывается удалять непустые каталоги. -maxdepthпереопределения -depth, которые необходимы -deleteдля удаления непустых каталогов. Без этого -maxdepthвы не сможете легко увидеть, какие каталоги будут удалены, поскольку в нем также перечислены файлы внутри каталогов. Не использовать -maxdepthтакже означает, что вы не можете легко использовать фильтры, как -name. Кроме того, -deleteудаляет каталоги, удаляя сначала все объекты внутри, что может занять много времени, если это большое и глубокое дерево.
лесмана
4

Я предпочитаю использовать find с -exec, это сделало бы ваш звонок примерно так:

find /config/filegroups/ -maxdepth 1 -mindepth 1 -type d -exec rm -rf {} \;
Panthro
источник
-2

Если вы уже в папке, вы можете просто набрать rm -rf ./**

Так:

cd /config/filesgroups
rm -rf ./**

Это глобальный шаблон для удаления всех подпапок из локального пути.

./ссылаясь на локальную папку ... и **для всех папок ниже ..

Mantisimo
источник
1
Какая папка и почему `**` `
RalfFriedl
1
Это будет точно так же, как rm -rf ./*, за исключением того, что вы, скорее всего, получите диагностические сообщения о «Нет такого файла или каталога», если вы не используете -fв своей команде (так как самый верхний каталог будет рекурсивно удален перед обработкой его содержимого). по rm).
Кусалананда