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

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

foo/ bar1/ bar2/ x.txt 

Я хочу удалить папки bar1 и bar2 и файл x.txt , не удаляя foo .

Также рассмотрите имена файлов со специальными символами, которые могут быть проигнорированы или вызвать ошибку.


Редактировать # 1 (30 Сен, 18:26 UTC):
Я думаю, что мой вопрос не является дубликатом этого вопроса , потому что я попросил удалить все в директории, в то время как другого вопроса не было, и ответы не включали такое решение.

Если вы знаете каталог, который вы можете использовать, используя одну из следующих команд:

 $ 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 "file" * file space1 file space2

$ ls -1d "dir" * dir space1 dir space2

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