Как мне удалить все в каталоге?

25

Как удалить все в каталоге, включая скрытые файлы и каталоги?

Прямо сейчас я использую следующее:

rm -rf *
rm -rf .*
Дэвид Смит
источник
5
Вы можете объединить их с rm -rf .* *.
пользователь неизвестен
2
Вы можете перейти на один каталог вверх и затем выполнитьrm -rf yourdirectory/*
shreyansp
1
извините пропустил скрытую часть каталога. Решение предыдущих пользователей охватывает это
shreyansp
Второй вариант, который вы опубликовали, очень опасен. Он будет соответствовать ..каталогу, который удалит все, что находится в каталоге выше .
Ричард Петерсон

Ответы:

17

Просто и прямо:

find -delete 

Включает каталоги и скрытые файлы. По крайней мере, гну-найти знает -delete, ваш findможет отличаться.

неизвестный пользователь
источник
1
Чтобы избежать удаления каталога, используйте find /path -delete -mindepth 1.
orodbhen
@orodbhen: find -delete не удалит каталог, в котором вы запускаете команду (как в вопросе с rm).
пользователь неизвестен
11

Лучший ответ: не делай этого. Рекурсивно удалите сам каталог, а затем воссоздайте его как пустой каталог. Другим людям легче и проще понять, что вы пытаетесь сделать. При повторном создании каталога он может иметь другого владельца, группу и разрешения. Если это важно, будьте осторожны. Кроме того, если какие-либо работающие программы имеют открытые файловые дескрипторы (дескрипторы) в каталоге, вы не захотите его удалять. Если ни один из этих особых случаев не применим, тогда проще удалить весь каталог.

Крис Квинель
источник
7
Так как же это проще? «Будь осторожен» - это не ответ. Я не понимаю, почему кто-то удаляет каталог и перестраивает его снова.
пользователь неизвестен
Я добавил фразу «как пустой каталог», возможно, это более понятно.
Крис Кнель
2
Нет, это не объясняет, почему вы удаляете каталог и затем воссоздаете его. К вещам, которые нужно учитывать, относится, между прочим, дата / время создания.
неизвестный пользователь
2
Если этот каталог является текущим рабочим каталогом какого-либо процесса, вы можете столкнуться с проблемами. Также, если вы удаляете каталог, вы удаляете информацию о его разрешениях и владении.
8
rm -rf -- * .[!.]* ..?*

Каждый из трех шаблонов расширяется до самого себя, если он ничего не соответствует, но это не проблема, поскольку мы хотим сопоставить все и rm -fигнорировать несуществующие аргументы.

Обратите внимание, что .*будет соответствовать.. .

Жиль "ТАК - перестань быть злым"
источник
5

Предполагая bash 4+:

shopt -s dotglob
rm -rf -- *
##or:
rm -rf ./*

С включенным dotglob, *расширяется на все файлы и каталоги, даже те, которые начинаются с .- но не расширяются до .и .., так что это безопасно для использования rm.

evilsoup
источник
2

если вы находитесь в каталоге:

cd .. && rm -rf dir && mkdir dir && cd dir

иначе:

rm -rf /path/to/dir && mkdir /path/to/dir

Дэвид Харрис
источник
2

Боже мой

rm -rf (.|)*

Опять же, это только для Zsh.

phunehehe
источник
2
Или *(D)( Dспецификатор glob включает glob_dotsопцию для этого шаблона).
Жиль "ТАК - перестать быть злым"
Или rm -rf {.,}*( в отличие от Баша, ЗШ не включает в себя .и ..в {.,}*, по крайней мере , на моей машине).
саша
1

Как насчет использования find. Я думаю, что в целом это хороший выбор, когда нужно копаться в подкаталогах.

find . -type f -exec rm {} \;
Slashdot
источник
1
есть ключ -delete, так что вы можете удалять каталоги. (по крайней мере, в GNU-найти).
пользователь неизвестен
это не удалит подкаталоги
саша
-2

Попробуй rm -rf *?*. Это удалит нормальные и скрытые файлы.

gladimdim
источник
4
Не в любой оболочке, о которой я знаю.
Жиль "ТАК ... перестать быть злым"
ты прав. он не удаляет подкаталоги.
gladimdim
4
Скорее всего, проблема заключается в том, что *?*они не будут соответствовать «точечным» файлам / каталогам (если вы не включили dotglobопцию в bash , GLOB_DOTSопцию в zsh или эквивалент для любой используемой вами оболочки).
Крис Джонсен