![Правильный способ удаления содержимого каталога](https://rvso.com/image/50569/%D0%9F%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9%20%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%20%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%20%D1%81%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%BC%D0%BE%D0%B3%D0%BE%20%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%B0%20.png)
Как правильно удалить?всесодержимое каталога, без указанного каталога?
Например, у меня следующая структура каталогов:
foo/
bar1/
bar2/
x.txt
Я хочу удалить папки bar1
и bar2
файл x.txt
,без удаления foo
.
Также обратите внимание на имена файлов со специальными символами, которые могут быть проигнорированы или вызвать ошибку.
Редактирование №1 (30 сентября, 18:26 UTC):
Я думаю, что мой вопрос не является дубликатомэтот вопрос, потому что я просил удалитьвсевнутри каталога, в то время как другой вопрос не имел такого решения, и ответы не включали его.
решение1
Если вы знаете каталог, вы можете сделать это, используя одну из следующих команд:
$ find foo/* -delete
$ rm -fr foo/*
$ find foo/* -exec rm -fr {} +
Если у вас есть файлы, начинающиеся с точки ( .
), то вам понадобится модифицированная версия rm
.
$ rm -fr foo/{*,.*}
Пример
$ ls -l foo
drwxrwxr-x 6 saml saml 4096 Sep 27 09:43 .
drwx------. 263 saml saml 32768 Sep 27 09:42 ..
drwxrwxr-x 2 saml saml 4096 Sep 27 09:43 dir1
drwxrwxr-x 2 saml saml 4096 Sep 27 09:43 dir2
drwxrwxr-x 2 saml saml 4096 Sep 27 09:43 dir space1
drwxrwxr-x 2 saml saml 4096 Sep 27 09:43 dir space2
-rw-rw-r-- 1 saml saml 0 Sep 27 09:43 .dot space1
-rw-rw-r-- 1 saml saml 0 Sep 27 09:43 .dot space2
-rw-rw-r-- 1 saml saml 0 Sep 27 09:43 file1
-rw-rw-r-- 1 saml saml 0 Sep 27 09:43 file2
-rw-rw-r-- 1 saml saml 0 Sep 27 09:43 file space1
-rw-rw-r-- 1 saml saml 0 Sep 27 09:43 file space2
$ rm -fr foo/{*,.*}
rm: cannot remove directory: `adir/.'
rm: cannot remove directory: `adir/..'
$
$ ls -l foo/
total 0
$
Повторяем с новым каталогом файлов:
$ find foo/* -delete
$
Работа со специальными символами
Если у вас есть каталог, в имени foo tastic
которого есть пробел, вы можете заключить его в кавычки, но все равно использовать подстановочный знак:
Пример
$ rm -fr "foo tastic"/*
Специальные символы
Я часто использую этот трюк, чтобы увидеть, что оболочка думает о моих фантазиях с именами файлов, прежде чем запускать их. В каталоге-образце, который я использовал выше:
$ ls -1 "файл"* файл пространство1 файл пространство2
$ ls -1d "dir "* dir space1 dir space2
Выполнив эти тесты заранее, вы сможете получить представление о том, какие файлы/каталоги будут задействованы при использовании команды, содержащей глоб.