видалити підпапки без видалення батьківської папки


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


13
Чи є якась проблема використовувати rm -rf / config / filesgroups / *?
dsmsk80

3
А може, навіть rm -rf /config/filegroups/filegroups{A,B}?
Драв Слоун

@dsumsky За замовчуванням bashне включає '.' папки в розширенні імені шляху. Що може бути, а може і не бажати. Сам я shopt -s dotglobв .bashrcце виправити. Просто бічна зауваження, що хтось може виявитись корисним;).
Мирослав Кошкар

Чи працював хтось із вас? Якщо так, чи не проти прийняти відповідь, щоб допомогти іншим людям, які хочуть зробити те саме?
Мауг каже, що повернемо Моніку

rm -rf /*зроблять;) --- серйозно не робіть цього
Мухаммед Умер

Відповіді:


28
rm -rf /config/filegroups/*

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

rm -rf /config/filegroups/*/

Якщо ви хочете видалити каталоги з іменами, що починаються .також на а, припускаючи, що у вас досить недавній баш, слід скористатися параметром оболонки dotglob:

shopt -s dotglob
rm -rf /config/filegroups/*/
shopt -u dotglob

і будь ласка, не заважайте, що це не буде працювати для 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"

Чи є якась - або причина не використовувати find«s -deleteваріанти?
зол

4
-deleteвідмовляється видаляти непорожні каталоги. -maxdepthзміни -depth, які потрібні -deleteдля видалення непорожніх каталогів. Без цього -maxdepthви не можете легко побачити, які каталоги буде видалено, оскільки вони також перераховують файли всередині каталогів. Якщо не використовувати -maxdepthтакож, ви не можете легко використовувати такі фільтри -name. Крім того, -deleteвидаляється каталоги, видаляючи спочатку всі об’єкти, що може зайняти багато часу, якщо це велике і глибоке дерево.
lesmana

4

Я вважаю за краще використовувати findз -exec, що зробить ваш дзвінок приблизно таким:

find /config/filegroups/ -maxdepth 1 -mindepth 1 -type d -exec rm -rf {} \;

-2

Якщо ви вже в папці, ви можете просто ввести rm -rf ./**

Так:

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

Це глобальний зразок для видалення всіх підпапок з локального шляху.

./посилаючись на локальну папку ... і **на всі папки внизу ..


1
Яка папка, і чому `**` `
RalfFriedl

1
Це буде точно так само, як rm -rf ./*, за винятком того, що ви, ймовірно, отримаєте діагностичні повідомлення про "Немає такого файлу чи каталогу", якщо ви не використовуєте -fв своїй команді (оскільки найпопулярніший каталог буде рекурсивно видалений до того, як його вміст буде оброблений по rm).
Кусалаланда
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.