Как удалить все файлы и подкаталоги в каталоге БЕЗ удаления каталога в bash?

45

Есть ли команда удалить все файлы и подкаталоги в каталоге БЕЗ удаления каталога?

Например, если у меня есть каталог «dontDeleteMe» с подкаталогами «1», «2», «3», и в каждом подкаталоге есть несколько изображений, как я могу удалить подкаталоги «1», «2» и «3» и все файлы в них, не удаляя родительский каталог «dontDeleteMe»?

    
задан user784637 26.10.2011 в 18:52
источник

10 ответов

60

Чтобы удалить все в каталог без удаления каталога, введите:

rm -rfv dontDeleteMe/*

Обратите внимание, что часть /* очень важна. Если вы поместите пробел до * , он удалит все ваши файлы в вашем текущем каталоге.

Кроме того, будьте очень осторожны, играя с rm , -r и * все в той же команде. Они могут быть катастрофической комбинацией.

Обновление: Хорошо, я понял, что у вас есть скрытые / точечные файлы [имена файлов с точками в начале, e.x. .hidden ], то это оставит эти файлы неповрежденными.

Итак, самое простое решение оригинального вопроса : rm -rfv dontDeleteMe && mkdir dontDeleteMe

Другой вариант - использовать find -exec или pipe для xargs (ниже):

find dontDeleteMe/* -print0 | xargs -0 rm -rv

    
ответ дан Matt 26.10.2011 в 19:23
источник
27

Единственная причина, по которой rm -r ./* не всегда работает, заключается в том, что у вас могут быть скрытые файлы и / или папка, которые не соответствуют * .

С этой целью bash предоставляет возможность сделать * совпадением со всеми, даже скрытыми объектами:

cd dont-delete-me
shopt -s dotglob
rm -r ./*

Может быть полезно сбросить dotglob в состояние по умолчанию (unset), если вы продолжаете использовать оболочку, в которой выполнялись указанные выше команды:

shopt -u dotglob 
    
ответ дан enzotib 26.10.2011 в 19:33
20

Открыть терминал ( Ctrl + Alt + T ) ant type this:

find somedir -mindepth 1 -delete

Это будет соответствовать всем файлам и каталогам внутри somedir и его (grand-) детей, включая «скрытые» точечные файлы, но исключая somedir из-за -mindepth 1 , затем -delete them.

    
ответ дан guciek 29.09.2012 в 13:48
6
find /dontDeleteMe/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;

Используйте xdev для удаления файлов только на границе устройства.

    
ответ дан Sergey 26.10.2011 в 19:36
4

Чтобы удалить (в терминале) все файлы и подкаталоги, за исключением базового каталога с именем «dontdelete»:

rm -rf dontdelete/*
    
ответ дан kyleN 26.10.2011 в 19:23
4

Вы можете использовать find с флагом -delete :

find dontDeleteMe/* -delete

Значение /* важно, так как он сообщает find искать только INSIDE в папке с именем «dontDeleteMe».

Также убедитесь, что флаг -delete находится в конце команды find .

    
ответ дан SaultDon 27.10.2011 в 04:09
3
rm -rf  directory/{.*,/*}

Что говорит:

Удалить все файлы, начиная с. в «каталоге» и всех других файлах.

Несмотря на то, что это несерьезно отмечено Neftas ,

Более безопасное решение:

 rm -rf directory/!(.|..)
    
ответ дан Tebe 14.04.2015 в 23:36
1

Я не уверен, почему это так сложно, помогите мне, если я ошибаюсь

cd DoNotDeleteDir #<- this is just to make sure we are inside
find . | xargs rm -rf

Вот оно

    
ответ дан user353305 15.09.2015 в 15:17
1

Существует еще более простой ответ:

  1. cd dontDeleteMe

  2. rm -rf *

Основная лекция по администрированию системы: Обязательно обратите внимание на то, где вы находитесь, когда используете такие команды подметания.

Я не могу сказать этого достаточно. Мне пришлось восстановить ящик, потому что кто-то не обращал внимания и набрал rm -rf * , в то время как /.

* nix предполагает, что если вы являетесь пользователем root или если вы являетесь sudo-ing root, вы знаете, что вы делаете. Поэтому убедитесь, что вы знаете, что делаете, прежде чем это сделать.

Альтернатива, которая гарантирует, что ваша команда «cd» работает до того, как вы выпустите «rm», будет использовать

cd dontDeleteMe && rm -rf *
    
ответ дан user30619 26.10.2011 в 21:09
0
  1. Самая простая вещь для меня - эксперт по Windows, но новичок ubuntu
  2. Щелкните значок Файлы на панели запуска
  3. Перейдите в каталог, в котором файлы и папки, которые вы хотите удалить
  4. Щелкните правой кнопкой мыши в пустой области окна рядом с файлами и нажмите «Открыть в терминале» - оставьте окно «Файлы» открытым.
  5. Откроется окно терминала и будет установлено «в папку, в которой вы находитесь»
  6. Вы можете ввести «dir» (игнорировать кавычки, когда я говорю тип), и нажать enter, чтобы терминал отображал список файлов и папок - просто чтобы убедиться, что вы находитесь в правой папке
  7. введите «rm -rf *» и нажмите enter
  8. в зависимости от размера папок / файлов для удаления системы приостанавливается
  9. Когда возвращается приглашение терминала, откроется окно Files, которое вы открыли, теперь «Папка пуста»
  10. У меня был успех в этом методе, и мне было приятно видеть файлы / папку как в окне «Файлы», так и в результате команды Dir в окне терминала.
  11. Мне также было приятно, что окно «Файлы» отображает папку в данный момент пустым, особенно потому, что я преследовал эти файлы, ища папку с корзинами, в которой они находились.
  12. Спасибо всем, кто подал ответы - это было очень информативно
ответ дан William Saxon 08.11.2016 в 10:12