4

Это правильный способ очистки текущего каталога, верно?

rm -r * .

5 ответов5

6

Нет, и по нескольким причинам: 1) эта команда попытается удалить . , который является текущим каталогом, и, таким образом, потерпит неудачу; 2) эта команда не удалит "скрытые" файлы, начинающиеся с символа «.» персонаж; 3) команда не удалит каталоги.

Вы можете использовать rm -rf * . Это удалит все файлы и каталоги, но не удалит точечные файлы. Вы можете использовать find . -type f | xargs rm удалит все файлы, включая скрытые, но это не удалит каталоги.

Итак, вы можете использовать это:

$ find . -print0 -type f -o -type d -not -name '\.' | xargs -0 rm -rf

Здесь вы рекурсивно находите все файлы и каталоги (если они не называются «.»), А затем удаляете их. -print0 и -0 позволяют ему правильно обрабатывать имена файлов с пробелами в их именах.

5

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

cd ..
rm -rf dirname
mkdir dirname
cd dirname

потому что это исключает ошибку при использовании rm -rf * в неправильном каталоге.

Примечание. Если каталог имеет нестандартные разрешения или принадлежит какой-либо другой учетной записи, вы потеряете его при удалении и повторном создании каталога. Это не то, что возникает у меня очень часто, но стоит задуматься.

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

2

Вы можете сделать это, если доступны ключи -mindepth и -delete:

find . -mindepth 1 -delete

Если вы хотите придерживаться POSIX, вы можете сделать это (как видно на unix.com):

find . \( ! -name . -prune \) -exec rm -rf {} \+
1

Одно простое решение, если вы не хотите использовать find, - это удалить текущий каталог, а затем воссоздать его:

rm -rf "`pwd`" && mkdir "`pwd`" && cd "`pwd`"
1

Если вы используете bash (версия 4 или выше), вы можете использовать опцию оболочки dotglob чтобы включить имена файлов, начинающиеся с точки, в вашем глобе.

shopt -s dotglob
rm -r -- *

Вышеприведенное будет разбито на каталоги, содержащие много сотен тысяч файлов; в этом случае вы можете использовать printf (который, будучи встроенным в bash, смеется перед лицом ARG_MAX ) и xargs (который предоставит rm безопасное количество аргументов).

shopt -s dotglob
printf '%q ' * | xargs rm -r --

Вы можете dotglob только закончите с:

shopt -u dotglob

Другой способ сделать это без возни с опциями оболочки:

rm -r -- * .[^.]* ..?*
##  or
printf '%q ' * .[^.]* ..?* | xargs rm -r --

Первый глоб * будет соответствовать всему текущему каталогу, который не начинается с точки; второй .[^.]* соответствует всему, что начинается с точки, за которой следует один не точечный символ, за которым следует любое количество других символов; третий шар соответствует двум точкам, за которыми следует любой один символ, за которым следует любое количество других символов. Это может быть полезно, если вы застряли в оболочке без опции dotglob; однако в таком случае printf может не быть встроенной оболочкой или может не иметь флага %q (который заключает в кавычки все пробелы и необычные символы в передаваемых ему аргументах, что делает их безопасными для передачи в xargs), поэтому вам, вероятно, следует в этом случае используйте одно из решений на основе find .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .