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

Существует ли команда для удаления всех файлов и подкаталогов в каталоге без удаления каталога?

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

53
задан 3 November 2012 в 07:35

12 ответов

Для удаления всего в каталоге, не удаляя каталог введите:

rm -rfv dontDeleteMe/*

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

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

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

Таким образом, действительно простое решение исходного вопроса: rm -rfv dontDeleteMe && mkdir dontDeleteMe

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

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

66
ответ дан 3 November 2012 в 07:35

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

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

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

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

shopt -u dotglob 
0
ответ дан 3 November 2012 в 07:35

Откройте терминал ( Ctrl + Alt + T ) и наберите следующий текст:

find somedir -mindepth 1 -delete

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

0
ответ дан 3 November 2012 в 07:35
find /dontDeleteMe/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;

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

0
ответ дан 3 November 2012 в 07:35

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

rm -rf dontdelete/*
0
ответ дан 3 November 2012 в 07:35
rm -rf  directory/{.*,/*}

Что говорит:

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

Хотя, как любезно отмечено Нефтасом , это решение небезопасно!

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

 rm -rf directory/!(.|..)
0
ответ дан 3 November 2012 в 07:35

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

find dontDeleteMe/* -delete

Параметр /* важен, поскольку говорит find искать только ВНУТРИ папки, называемой "dontDeleteMe".

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

0
ответ дан 3 November 2012 в 07:35

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

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

Вот и все

0
ответ дан 3 November 2012 в 07:35

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

  1. cd dontDeleteMe

  2. rm -rf *

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

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

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

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

cd dontDeleteMe && rm -rf *
0
ответ дан 3 November 2012 в 07:35
rm -rf ${PWD}/*

очистит текущий рабочий каталог

0
ответ дан 3 November 2012 в 07:35
  1. Самая простая вещь для меня - эксперт по Windows, но новичок в Ubuntu
  2. Щелкните значок «Файлы» на панели запуска
  3. Перейдите в каталог, где находятся файлы и папки, которые вы хотите удалить
  4. Щелкните правой кнопкой мыши в пустой области окна рядом с файлами и нажмите «Открыть в терминале» - оставьте окно «Файлы» открытым
  5. Окно терминала откроется и будет « установить "на папку, которую вы нашли
  6. Вы можете набрать" dir "(игнорировать кавычки, когда я говорю" тип ") и нажать Enter для терминала, чтобы показать список файлов и папок - просто чтобы доказать, что вы" в " правая папка
  7. , введите «rm -rf *» и нажмите enter
  8. в зависимости от размера папок / файлов, чтобы удалить систему, приостановит работу
  9. Когда возвращается запрос терминала, файлы окно, которое вы открыли, теперь скажет «Папка пуста»
  10. У меня был успех с этим методом, и он дал мне возможность видеть файлы / папки как в окне «Файлы», так и в результате команды Dir в окно терминала
  11. Меня также порадовало, что в окне «Файлы» папка теперь пуста - тем более, что я гнался за этими файлами в поисках папки с мусором, в которой они находились
  12. Спасибо всем, кто отправил ответы - это было очень информативно
0
ответ дан 3 November 2012 в 07:35

Я бы использовал find как было предложено ответом guciek , и добавьте -xdev , чтобы убедиться, что он не переходит в другие файловые системы:

find 'dontDeleteMe' -xdev -mindepth 1 -deletea

(я добавил кавычки на случай, если реальный путь содержит пробелы)

Альтернативой с Bash и rm может быть

rm -rf 'dontDeleteMe'/{*,.[!.]*}

Это также позволит удалить скрытые файлы без ошибок. Подробнее см. этот ответ.

0
ответ дан 8 July 2020 в 13:32

Другие вопросы по тегам:

Похожие вопросы: