Как удалить все файлы и подкаталоги в каталоге БЕЗ удаления каталога в 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/!(.|..)
Есть еще более простой ответ:
cd dontDeleteMe
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
это оно
Я хотел бы использовать
find
как это было предложено ответом Guciek, и добавьте
-xdev
чтобы убедиться, что он не спускается в другие файловые системы:
find 'dontDeleteMe' -xdev -mindepth 1 -deletea
(Я добавил кавычки на случай, если реальный путь содержит пробелы)
Альтернатива с Bash и
rm
может быть
rm -rf 'dontDeleteMe'/{*,.[!.]*}
Это также удалит скрытые файлы без ошибок. См. Этот ответ для подробностей.
- Самая простая вещь для меня - эксперт по Windows, но новичок в Ubuntu
- Нажмите значок "Файлы" на панели запуска.
- Перейдите в каталог, где находятся файлы и папки, которые вы хотите удалить
- Щелкните правой кнопкой мыши в пустой области окна рядом с файлами и нажмите "Открыть в терминале" - оставьте окно "Файлы" открытым
- Откроется окно терминала, которое будет "установлено" в папку, которую вы нашли
- Вы можете набрать "dir" (игнорировать кавычки, когда я говорю "type") и нажать Enter для терминала, чтобы показать список файлов и папок - просто чтобы доказать, что вы "в" нужной папке
- введите "rm -rf *" и нажмите ввод
- в зависимости от размера папок / файлов для удаления система сделает паузу
- Когда появится запрос терминала, в открывшемся окне "Файлы" появится сообщение "Папка пуста"
- У меня был успех с этим методом, и он дал мне комфорт видеть файлы / папку как в окне "Файлы", так и в результате команды Dir в окне терминала
- Меня также порадовало, что в окне "Файлы" отображается пустая папка - тем более, что я гонялся за этими файлами в поисках папки с мусором, в которой они находились.
- Спасибо всем, кто прислал ответы - это было очень информативно