Правильный способ удаления содержимого каталога

Правильный способ удаления содержимого каталога

Как правильно удалить?всесодержимое каталога, без указанного каталога?
Например, у меня следующая структура каталогов:

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

Выполнив эти тесты заранее, вы сможете получить представление о том, какие файлы/каталоги будут задействованы при использовании команды, содержащей глоб.

Связанный контент