Существует ли команда для удаления всех файлов и подкаталогов в каталоге без удаления каталога?
Например, если у меня есть каталог «dontDeleteMe» с подкаталогами «1», «2», «3» и в каждом подкаталоге есть несколько изображений, как я могу удалить подкаталоги «1», «2» и «3» и все файлы в них, не удаляя родительский каталог «dontDeleteMe»?
Для удаления всего в каталоге, не удаляя каталог введите:
rm -rfv dontDeleteMe/*
Отметьте, /*
часть очень важна. Если Вы помещаете пространство перед *
, это удалит все Ваши файлы в Вашем текущем каталоге.
Кроме того, быть очень тщательным проигрыванием с rm
, -r
и *
все в той же команде. Они могут быть катастрофической комбинацией.
Обновление: Хорошо, я понял, есть ли у Вас действительно скрытые/точечные файлы [именами файлов с точками вначале, e.x. .hidden
] затем это оставит те файлы неповрежденными.
Таким образом, действительно простое решение исходного вопроса: rm -rfv dontDeleteMe && mkdir dontDeleteMe
Другой должен был бы использовать find
-exec
опция или канал к xargs
(ниже):
find dontDeleteMe/* -print0 | xargs -0 rm -rv
Единственная причина, по которой rm -r ./*
не всегда работает, заключается в том, что у вас могут быть скрытые файлы и / или папки, которые не соответствуют *
.
С этой целью bash
предоставляют возможность сделать *
сопоставленным со всем, даже со скрытыми объектами:
cd dont-delete-me
shopt -s dotglob
rm -r ./*
Может быть полезно сбросить dotglob
в состояние по умолчанию (не установлено) , если вы продолжаете использовать оболочку, в которой вы выполняли вышеуказанные команды:
shopt -u dotglob
Откройте терминал ( Ctrl kbd> + Alt kbd> + T kbd>) и наберите следующий текст:
find somedir -mindepth 1 -delete
Это будет соответствовать всем файлы и каталоги внутри somedir
и его (внучатых) потомков, включая «скрытые» точечные файлы, но исключая сам somedir
из-за -mindepth 1
, а затем -delete
из них.
find /dontDeleteMe/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;
Используйте опцию xdev
для удаления файлов только в пределах границ устройства.
Чтобы удалить (в терминале) все файлы и подкаталоги, кроме базового каталога с именем "dontdelete":
rm -rf dontdelete/*
rm -rf directory/{.*,/*}
Что говорит:
Удалить все файлы, начиная с. в «каталоге» и во всех других файлах.
Хотя, как любезно отмечено Нефтасом , это решение небезопасно!
Более безопасное решение:
rm -rf directory/!(.|..)
Вы можете использовать find
с флагом -delete
:
find dontDeleteMe/* -delete
Параметр /*
важен, поскольку говорит find
искать только ВНУТРИ папки, называемой "dontDeleteMe".
Также убедитесь, что флаг -delete
находится в конце команды find
.
Я не уверен, почему это так сложно, помоги мне, если я не прав
cd DoNotDeleteDir #<- this is just to make sure we are inside
find . | xargs rm -rf
Вот и все
Существует еще более простой ответ:
cd dontDeleteMe
rm -rf *
Я не могу сказать этого достаточно. Мне пришлось восстановить коробку, потому что кто-то не обращал внимания и набрал rm -rf *
в /.
* nix предполагает, что, если вы являетесь пользователем root или вы являетесь пользователем root, вы знаете, что делаете. Поэтому убедитесь, что вы знаете, что делаете, прежде чем сделать это.
Альтернативой, которая гарантирует, что ваша команда 'cd' работает до того, как вы выпустите 'rm', является использование
cd dontDeleteMe && rm -rf *
rm -rf ${PWD}/*
очистит текущий рабочий каталог
Я бы использовал find
как было предложено ответом guciek , и добавьте -xdev
, чтобы убедиться, что он не переходит в другие файловые системы:
find 'dontDeleteMe' -xdev -mindepth 1 -deletea
(я добавил кавычки на случай, если реальный путь содержит пробелы)
Альтернативой с Bash и rm
может быть
rm -rf 'dontDeleteMe'/{*,.[!.]*}
Это также позволит удалить скрытые файлы без ошибок. Подробнее см. этот ответ.