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

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

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

11 ответов

Решение

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

rm -rfv dontDeleteMe/*

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

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

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

На самом деле, самое простое решение исходного вопроса: rm -rfv dontDeleteMe && mkdir dontDeleteMe

Еще один будет использовать find"s -exec вариант или труба xargs (ниже):

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

Откройте терминал (Ctrl+Alt+T) и введите:

find somedir -mindepth 1 -delete

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

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

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

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

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

shopt -u dotglob 
find /dontDeleteMe/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;

использование xdev Возможность удалять файлы только в пределах устройства.

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

find dontDeleteMe/* -delete

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

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

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

rm -rf dontdelete/*
rm -rf  directory/{.*,/*}

Что говорит:

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

Хотя, как любезно отметил Stefan van den Akker, это решение небезопасно!

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

 rm -rf directory/!(.|..)

Есть еще более простой ответ:

  1. cd dontDeleteMe

  2. rm -rf *

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

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

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

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

cd dontDeleteMe && rm -rf *

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

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

это оно

rm -rf ${PWD}/*

очистит настоящий рабочий каталог

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

find 'dontDeleteMe' -xdev -mindepth 1 -deletea

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

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

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

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

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